面试题-栈排序

题目

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

示例

输入:
[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]
相当于 创建有序栈,push(1),push(2),peek(),pop(),peek()
返回结果:[null,null,null,1,null,2]

思路

题目中已经提示可以使用临时栈来存放数据。因此创建一个主栈stack,创建一个辅助栈helper,辅助栈用来存放比当前添加元素小的元素。
push操作时,如果stack不为空,当前元素大于栈顶元素,将栈顶元素加入helper,依次比较stack栈顶元素和待添加的元素大小,直到添加的元素小于等于stack的栈顶元素。然后将待添加元素入栈,将helper中的元素依次弹出放入stack中。

代码实现

class SortedStack {
    
    
    private Deque<Integer> stack;
    private Deque<Integer> helper;
    
    public SortedStack() {
    
    
        stack = new LinkedList<>();
        helper = new LinkedList<>();
    }
    
    public void push(int val) {
    
    
        //先将栈中小于待添加元素的值都移到辅助站中
        while (!stack.isEmpty()&&stack.peek()<val){
    
    
            helper.push(stack.pop());
        }
        //这时stack中栈顶元素已经大于等于val,符合栈顶是最小值条件
        //添加val到stack中
        stack.push(val);
        //将小于val的辅助栈中的元素都添加到stack
        while (!helper.isEmpty()){
    
    
            stack.push(helper.pop());
        }
    }
    
    public void pop() {
    
    
        if(!stack.isEmpty()){
    
    
            stack.pop();
        }
       
    }
    
    public int peek() {
    
    
        return isEmpty()?-1:stack.peek();
    }
    
    public boolean isEmpty() {
    
    
        return stack.isEmpty();
    }
}


猜你喜欢

转载自blog.csdn.net/qq_43672652/article/details/114902026