[LintCode 229.] 栈排序

229. 栈排序

题目描述

请设计一种方法将一个栈进行升序排列 (最大的数在最上面)。

你可以使用另外一个栈来辅助操作,但不可将这些数复制到另外一个数据结构中 (如,数组)。

样例
给一个栈:[4,2,1,3],
排序之后:[1,2,3,4],
最右边是栈顶。

注意事项
时间复杂度为O(n^2)的算法也可以通过测试

解题思路

双栈操作。
使用两个栈,一个大顶栈,一个小顶栈。指定给定的栈为大顶栈,使用小顶栈逐步梳理大顶栈顶部元素顺序。

  1. 首先从大顶栈依次弹出元素,并压入小顶栈,直到弹出的元素比小顶栈的栈顶大;
  2. 然后栈顶比该元素小的元素,依次弹出并压入大顶栈,然后压入该元素;
  3. 回到第一步,重复前面的操作,直到大顶栈中没有元素,进入下一步;
  4. 将小顶栈中的元素依次弹出并压入大顶栈。

参考代码

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);
        }
    }
};
原文地址:https://www.cnblogs.com/zhcpku/p/14260237.html