栈排序

题目描述

来源于 https://leetcode-cn.com/

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:pushpoppeekisEmpty。当栈为空时,peek 返回 -1。

示例1:

 输入:
["SortedStack", "push", "push", "peek", "pop", "peek"]
[[], [1], [2], [], [], []]
 输出:
[null,null,null,1,null,2]

示例2:

 输入: 
["SortedStack", "pop", "pop", "push", "pop", "isEmpty"]
[[], [], [], [1], [], []]
 输出:
[null,null,null,null,null,true]

说明:

  1. 栈中的元素数目在[0, 5000]范围内。

解法:

如果栈顶元素小于 val,就把小于 val 的元素全部 push 到另一个栈中。然后将 val 入栈,再把另一个栈中的元素转移过来。

class SortedStack {
public:
    SortedStack() {
    }

    void push(int val) {
        while(!stk1.empty() && stk1.top() < val){
            stk2.push(stk1.top());
            stk1.pop();
        }
        stk1.push(val);
        while(!stk2.empty()){
            stk1.push(stk2.top());
            stk2.pop();
        }
    }

    void pop() {
        if(stk1.empty()){
            return;
        }
        stk1.pop();
    }

    int peek() {
        if(stk1.empty()){
            return -1;
        }
        return stk1.top();
    }

    bool isEmpty() {
        return stk1.empty();
    }

private:
    stack<int> stk1;
    stack<int> stk2;
};