力扣:03.05栈排序

122 阅读2分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

描述

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,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]
  • 提示:
  • 栈中的元素数目在[0, 5000]范围内。

解析

题目的意思是用栈来做,而且最多只能用一个辅助栈来完成对栈的排序,所以根据题目的意思应该使用两个栈来解题, 思想和单调栈的思想差不多,当入栈的元素val大于栈顶时用辅助栈来保存弹出的数据,当栈顶元素大于等于val时入栈,然后将help栈的元素圧回data栈。

具体步骤可分为以下几步:

  1. 如果数据栈不为空,且本次push值大于栈顶的值,则将数据栈顶弹出,然后压入辅助栈,直到数据栈为空或者push值不大于栈顶值,退出循环。

  2. 将本次push值压入数据栈。

  3. 将临时栈里面的数据压入数据栈。

    • pop:当数据栈不为空,执行pop
    • peek:当数据栈为空,返回-1,否者数据栈执行peek
    • isEmpty:执行数据栈的empty()
class SortedStack {
    Stack<Integer> stack = new Stack<>();
    Stack<Integer> temp = new Stack<>();
    public SortedStack() {
​
    }
    
    public void push(int val) {
        while(!stack.empty() && val > stack.peek()){
            temp.push(stack.pop());
        }
        stack.push(val);
        while(!temp.empty()){
            stack.push(temp.pop());
        }
    }
    
    public void pop() {
        if(stack.empty()){
            return;
        }
        stack.pop();
    }
    
    public int peek() {
        if(isEmpty()){
            return -1;
        }else{
            return stack.peek();
        }
    }
    
    public boolean isEmpty() {
        return stack.empty();
    }
}
​
/**
 * Your SortedStack object will be instantiated and called as such:
 * SortedStack obj = new SortedStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.isEmpty();
 */

运行结果:

执行结果:通过

执行用时:150 ms, 在所有 Java 提交中击败了51.92%的用户

内存消耗:38.6 MB, 在所有 Java 提交中击败了61.26%的用户