栈 stack_one 中的元素都是 int 类型,要求使用另外一个栈容器 stack_two 来实现栈 stack_one 中的元素能够从栈顶到栈底的降序排列(从大到小)。
算法思路:
- 从栈 stack_one 中弹出栈顶元素,如果小于等于 stack_two 栈顶元素,则入栈。始终保持 stack_two 中元素从栈顶到栈底是由小变大的;
- 如果 stack_one 中栈顶元素大于 stack_two 栈顶元素。直接压栈的话,就没办法保证 stack_two 是从小到大了。此时,我们就需要从 stack_two 弹出栈顶元素,让其和从 stack_one 弹出的元素比较,如果比其小则压入到 stack_one 中,直到从 stack_one 中弹出的元素比从 stack_two 中弹出的元素小或者等于为止。
- 接着,重复 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

冀公网安备13050302001966号