首页 > 编程语言 > 详细

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

时间:2020-07-24 12:33:53      阅读:78      评论:0      收藏:0      [点我收藏+]

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

题目描述

技术分享图片

输入输出

技术分享图片

思路

主要思路:

? 利用一个辅助栈来帮助在插入一个元素的时候进行排序,使得我们的主栈内元素始终是有序的(栈底到栈顶大到小),当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)

技术分享图片

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!