zoukankan      html  css  js  c++  java
  • 程序员面试金典-面试题 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();
     */
  • 相关阅读:
    String类的常用成员方法
    String类和StringBuffer类
    记事本
    GridLayout 可使容器中的各个组件呈网格状布局
    在使用add()方法添加组件到容器时,必须指定将其放置在哪个区域中
    每个容器都有一个布局管理器
    框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口
    面板是一种透明的容器,没有标题和边框
    要生成一个窗口,通常使用Window的子类Frame类进行实例化
    分布式系统 (大规模分布式系统原理解析和架构实践)
  • 原文地址:https://www.cnblogs.com/silentteller/p/12421050.html
Copyright © 2011-2022 走看看