1. 程式人生 > 實用技巧 >劍指offer 30:包含min 函式的棧

劍指offer 30:包含min 函式的棧

package com.example.lettcode.offer;

import java.util.Stack;

/**
 * @Class MinStack
 * @Description 劍指offer 30 包含min 函式的棧
 * 定義棧的資料結構,請在該型別中實現一個能夠得到棧的最小元素的 min 函式在該棧中,
 * 呼叫 min、push 及 pop 的時間複雜度都是 O(1)。
 * 示例:
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.min();   --> 返回 -3.
 * minStack.pop();
 * minStack.top();      --> 返回 0.
 * minStack.min();   --> 返回 -2.
 * @Author
 * @Date 2020/7/17
 **/
public class MinStack {

    // 儲存入棧的元素
    public Stack<Integer> data;
    // 儲存最小元素
    public Stack<Integer> min;

    /**
     * initialize your data structure here.
     */
    public MinStack() {
        data = new Stack<>();
        min = new Stack<>();
    }


    /** 定義兩個stack,一個為存放最小數的序列的輔助棧。
     * 壓棧時,先將元素 x 壓入 stack1。然後判斷 stack2 的情況:
     * stack2 棧為空或者棧頂元素大於 x,則將 x 壓入 stack2 中。
     * stack2 棧不為空且棧定元素小於 x,則重複壓入棧頂元素。
     * 獲取最小元素時,從 stack2 中獲取棧頂元素即可。
     **/
    public void push(int x) {
        // min 棧儲存的一直是date棧中入棧時的最小元素,兩個棧的個數相同
        // add是繼承自Vector的方法,且返回值型別是boolean。
        // push是Stack自身的方法,返回值型別是引數類型別。
        data.push(x);
        if (min.size() == 0 || min.peek() > x) {
            min.push(x);
        }else {
            min.push(min.peek());
        }
    }

    public void pop() {
        // pop()函式返回棧頂的元素,並且將該棧頂元素出棧。
        data.pop();
        min.pop();
    }

    public int top() {
        // peek()函式返回棧頂的元素,但不彈出該棧頂元素。
        return data.peek();
    }

    public int min() {
        return min.peek();
    }
}
// 測試用例
public static void main(String[] args) {
	MinStack minStack = new MinStack();
	minStack.push(-2);
	minStack.push(0);
	minStack.push(-3);
	System.out.println(minStack.min());
	minStack.pop();
	System.out.println(minStack.top());
	System.out.println(minStack.min());
}