1. 程式人生 > 實用技巧 >[程式設計題] lc:[面試題 0305 棧排序

[程式設計題] lc:[面試題 0305 棧排序

[程式設計題] 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)