栈 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