[编程题] lc:[面试题 0305 栈排序

[编程题] lc:面试题 03.05. 栈排序

题目描述

image-20200724104917976

输入输出

image-20200724104932702

思路

主要思路:

​ 利用一个辅助栈来帮助在插入一个元素的时候进行排序,使得我们的主栈内元素始终是有序的(栈底到栈顶大到小),当push一个元素到主栈的时候,实在先看主栈栈顶元素。

  • 如果栈顶元素小于当前val,利用辅助栈将主栈栈顶元素先压入辅助栈,看此时的主栈的栈顶元素与要插入元素val的大小,满足栈顶元素大于val了的话,就可以把val放入到主栈中了、
  • 把val放入主栈后,我们需要从临时栈中再把元素pop出压入主栈,

注:主要就是在插入元素的过程中,主栈的元素都是比val大,临时栈都比val小。

Java代码

import java.util.*;


//思想,在插入的时候就循环检测主栈元素栈顶,要求主栈元素均大于val,辅助栈均小于val.
class SortedStack {

    //初始栈
    Deque<Integer> stack;
    //临时栈
    Deque<Integer> tempStack;

    public SortedStack() {
       stack = new LinkedList<Integer>();
        tempStack = new LinkedList<Integer>();
    }
    
    public void push(int val) {
        if(stack.isEmpty()){
            stack.push(val);
        }else{
            //这里必须是循环多次移动比较栈顶元素的情况
            while(!stack.isEmpty() && val> stack.peek()){
                tempStack.push(stack.pop());  //把这个主栈栈顶元素拿出放入临时栈;再继续比较主栈新的栈顶和val
            }
            //退出上述while就找到了val可以放入到主栈的位置
            stack.push(val);
            //此时把临时栈中的元素都拿回来。
            while(!tempStack.isEmpty()){
                stack.push(tempStack.pop());
            }
        }
    }
    
    public void pop() {
        if(stack.isEmpty()){
            return;
        }
        //直接pop
        stack.pop();

    }
    
    public int peek() {
        if(stack.isEmpty()){
            return -1;
        }else{
            return stack.peek();
        }
    }
    
    public boolean isEmpty() {
        return stack.isEmpty();
    }
}

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

时间复杂度

最坏O(n)

image-20200724105802236

原文地址:https://www.cnblogs.com/jiyongjia/p/13370794.html