程序员面试金典-面试题 03.05. 栈排序

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

程序员面试金典-面试题 03.05. 栈排序

silentteller   2020-03-05 我要评论

题目:

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

分析:

利用一个辅助栈来帮助排序,使得我们的栈内元素始终是有序的,当push一个元素,利用辅助栈将栈内已经排好序的元素保存起来,将该元素压入,再把辅助栈的元素压回到主栈中。

不过发现用时较大,我们把它优化下。不难发现,开始的想法,是每压入一个元素的话,都会进行排序,但如果遇到1,2,3,4,5,6,7,8,9这样的入栈顺序的话,为了保证栈内元素有序,会需要大量的辅助栈操作。那么优化的思路就是,只有在调用peek操作的时候,才将两个栈合并,正常压入栈时,我们只需要保证,主栈元素有序且均大于压入元素,辅助栈元素有序且小于压入元素,当需要peek或pop时,才将两个栈合并。

程序:

// 228 ms
class SortedStack {

    public SortedStack() {
        stack = new Stack<Integer>();
        tempStack = new Stack<Integer>();
    }
    
    public void push(int val) {
        if(stack.isEmpty())
            stack.push(val);
        else{
            while(!stack.isEmpty() && val > stack.peek()){
                tempStack.push(stack.pop());
            }
            stack.push(val);
            while(!tempStack.isEmpty()){
                stack.push(tempStack.pop());
            }
        }
    }
    
    public void pop() {
        if(stack.isEmpty())
            return;
        stack.pop();
    }
    
    public int peek() {
        if(stack.isEmpty())
            return -1;
        return stack.peek();
    }
    
    public boolean isEmpty() {
        return stack.isEmpty();
    }

    private Stack<Integer> stack;
    private Stack<Integer> tempStack;
}

/**
 * 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();
 */
// 18 ms
class SortedStack {

    public SortedStack() {
        stack = new Stack<Integer>();
        tempStack = new Stack<Integer>();
    }
    
    public void push(int val) {
        if(!stack.isEmpty()){
            if(stack.peek() > val){
                while(!tempStack.isEmpty() && tempStack.peek() > val){
                    stack.push(tempStack.pop());
                }
            }else{
                while(!stack.isEmpty() && stack.peek() < val){
                    tempStack.push(stack.pop());
                }
            }
        }
        stack.push(val);
    }
    
    public void pop() {
        if(peek() == -1)
            return;
        stack.pop();
    }
    
    public int peek() {
        while(!tempStack.isEmpty()){
            stack.push(tempStack.pop());
        }
        if(stack.isEmpty())
            return -1;
        return stack.peek();
    }
    
    public boolean isEmpty() {
        return stack.isEmpty() && tempStack.isEmpty();
    }

    private Stack<Integer> stack;
    private Stack<Integer> tempStack;
}

/**
 * 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();
 */

 

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们