[LintCode 229.] 栈排序
题目描述
请设计一种方法将一个栈进行升序排列 (最大的数在最上面)。
你可以使用另外一个栈来辅助操作,但不可将这些数复制到另外一个数据结构中 (如,数组)。
样例
给一个栈:[4,2,1,3],
排序之后:[1,2,3,4],
最右边是栈顶。
注意事项
时间复杂度为O(n^2)的算法也可以通过测试
解题思路
双栈操作。
使用两个栈,一个大顶栈,一个小顶栈。指定给定的栈为大顶栈,使用小顶栈逐步梳理大顶栈顶部元素顺序。
- 首先从大顶栈依次弹出元素,并压入小顶栈,直到弹出的元素比小顶栈的栈顶大;
- 然后栈顶比该元素小的元素,依次弹出并压入大顶栈,然后压入该元素;
- 回到第一步,重复前面的操作,直到大顶栈中没有元素,进入下一步;
- 将小顶栈中的元素依次弹出并压入大顶栈。
参考代码
class Solution {
public:
/*
* @param stk: an integer stack
* @return: void
*/
void stackSorting(stack<int>& stk) {
// write your code here
if (stk.size() <= 1) return;
stack<int>& maxTop = stk;
stack<int> minTop;
while (!maxTop.empty()) {
while (!maxTop.empty() && (minTop.empty() || minTop.top() > maxTop.top())) {
int val = maxTop.top();
minTop.push(val);
maxTop.pop();
}
if (maxTop.empty()) break;
int val = maxTop.top();
maxTop.pop();
while (!minTop.empty() && minTop.top() < val) {
int tmp = minTop.top();
minTop.pop();
maxTop.push(tmp);
}
minTop.push(val);
}
while (!minTop.empty()) {
int val = minTop.top();
minTop.pop();
maxTop.push(val);
}
}
};