用一个 Stack 实现另一个 Stack 的排序

栈 stack_one 中的元素都是 int 类型,要求使用另外一个栈容器 stack_two 来实现栈 stack_one 中的元素能够从栈顶到栈底的降序排列(从大到小)。

算法思路:

  1. 从栈 stack_one 中弹出栈顶元素,如果小于等于 stack_two 栈顶元素,则入栈。始终保持 stack_two 中元素从栈顶到栈底是由小变大的;
  2. 如果 stack_one 中栈顶元素大于 stack_two 栈顶元素。直接压栈的话,就没办法保证 stack_two 是从小到大了。此时,我们就需要从 stack_two 弹出栈顶元素,让其和从 stack_one 弹出的元素比较,如果比其小则压入到 stack_one 中,直到从 stack_one 中弹出的元素比从 stack_two 中弹出的元素小或者等于为止。
  3. 接着,重复 1- 2 步,直到 stack_one 为空停止。 最后,将 stack_two 的元素弹出压入到 stack_one 即可。

示例代码:

#include <iostream>
#include <stack>
using namespace std;


void sort_stack(stack<int> &stack_one)
{
	// 1. 初始化辅助栈
	stack<int> stack_two;
	
	// 2. 开始排序 
	while (!stack_one.empty())
	{	
		// 从 stack_one 弹出栈顶元素
		int element_one = stack_one.top();
		stack_one.pop();

		// 将元素压栈到 stack_two 中
		// 如果 stack_two 为空,则直接压栈
		if (stack_two.empty())
		{
			stack_two.push(element_one);
			continue;
		}

		// 如果 stack_one 栈顶元素比 stack_two 栈顶元素小或者等于,则直接入栈
		if (element_one <= stack_two.top())
		{
			stack_two.push(element_one);
			continue;
		}

		// 如果 stack_one 栈顶元素比 stack_two 栈顶元素大,则将 stack_two 中的元素逐个弹出并压栈到 stack_one 中
		// 直到 stack_one 栈顶元素比 stack_two 栈顶元素小于等于,或者 stack_two 为空
		while (!stack_two.empty() && element_one > stack_two.top())
		{
			stack_one.push(stack_two.top());
			stack_two.pop();
		}

		// 最后,将 element_one 压入到 stack_two 栈中
		stack_two.push(element_one);
		
	}

	// 3. 将 stack_two 中元素压入到 stack_one 中
	while (!stack_two.empty())
	{
		stack_one.push(stack_two.top());
		stack_two.pop();
	}

}

int main()
{
	stack<int> stack_one;
	stack_one.push(9);
	stack_one.push(3);
	stack_one.push(5);
	stack_one.push(8);
	stack_one.push(6);


	sort_stack(stack_one);

	while (!stack_one.empty())
	{
		cout << stack_one.top() << " ";
		stack_one.pop();
	}

	return 0;
}

程序输出结果:

9 8 6 5 3
未经允许不得转载:一亩三分地 » 用一个 Stack 实现另一个 Stack 的排序