背景:
- 一个栈的排序其实是很好做的,但是现在要你将该栈从顶到底从大到小排序,只允许申请一个辅助栈,可以申请有限个变量,除此之外不能再申请额外的数据结构,你该怎么搞?
算法:
- 设要排序的栈为
st
,辅助栈为help
,从st
弹出的元素记为cur
,help
的栈顶元素记为top
。
-
- 如果
cur
小于或等于top
,则将cur
压入help
; - 如果
cur
大于top
,则将help
中的元素逐一弹出并压入st
,直到cur
小于等于top
,再将cur
压入help
。
- 一直执行上述操作,直到
st
为空结束,这时再把help
中的元素一一压回st
就行了,算法结束。
代码:
#include <bits/stdc++.h>
using namespace std;
template<class T>
void sortStByHelp(stack<T> &st)
{
stack<T> help;
while (!st.empty()) {
T cur = st.top();
st.pop();
for (; !help.empty() && cur > help.top(); st.push(help.top()), help.pop());
help.push(cur);
}
for (; !help.empty(); st.push(help.top()), help.pop());
}
int main()
{
stack<int> st({1, 2, -1, 7, 9, 0});
sortStByHelp(st);
for (; !st.empty(); cout << st.top() << endl, st.pop());
return 0;
}