劍指offer 30:包含min 函式的棧
阿新 • • 發佈:2020-07-17
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());
}