演算法題:O(1)時間複雜度實現獲取棧的最大值、最小值

5星上將發表於2020-10-25

問題描述

實現O(1)獲取最大最小值的棧
問題:定義棧的資料結構,請在該型別中實現一個能夠得到棧的最小元素的getMin函式,getMax函式。在該棧中,呼叫getMin、getMax、push及pop的時間複雜度都是O(1).

思路

定義一個minStack輔助棧每次記住入棧stack的最小值,即:將資料分別入棧stack和minStack,當入棧minStack的時候,與棧頂元素比較大小,若小於棧頂元素,則入棧成為新的棧頂元素,若大於棧頂元素,則入棧原先的棧頂元素。
getMax的思路同上。

程式碼

import java.util.Stack;

/**
 * 實現O(1)獲取最大最小值的棧
 */
public class NewStack{

    Stack<Integer> stack = new Stack<>();
    Stack<Integer> maxStack = new Stack<>();
    Stack<Integer> minStack = new Stack<>();
    public void Push(int e){
        stack.push(e);
        if (minStack.empty() || e < minStack.peek()){
            minStack.push(e);
        }else if (e > minStack.peek()){

            minStack.push(minStack.peek());
        }

        if (maxStack.empty() || e > maxStack.peek()){
            maxStack.push(e);
        }else if (e < maxStack.peek()){
            maxStack.push(maxStack.peek());
        }
    }
	//pop時要注意棧是否為空
    public int Pop(){
        if (!stack.empty()&&!maxStack.empty()&&!minStack.empty()){
            int e = stack.pop();
            minStack.pop();
            maxStack.pop();
            return e;
        }
        else {
            System.out.println("棧為空!");
            return 0;
        }

    }

    public int getMax(){

        return maxStack.peek();
    }

    public int getMin(){

        return minStack.peek();
    }
}

相關文章