題目:
實現一個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。
要求:
1、pop、push、getMin操作的時間複雜度都是O(1)
2、設計的棧型別可以輸用現成的棧結構
解答:
藉助另一個棧,記錄stackData棧中的最小元素,【stackMin 棧儲存最小元素】
import java.util.Stack; public class Problem01_GetMinStack { public static class myStack{ private Stack<Integer> stackData; private Stack<Integer> stackMin; public myStack(){ this.stackData = new Stack<Integer>(); this.stackMin = new Stack<Integer>(); } // push /* 策略: 將stackData的棧頂元素與stackMin中棧頂元素做對比 * 1. 如果stackMin棧為空,將【newNum】push到stackMin * 2. 如果stackMin棧不為空,newNum <= 【stackData的棧頂元素】, 將newNum push 至 stackMin newNum > 【stackData的棧頂元素】, 不進行任何操作 */ public void push (int newNum){ if (this.stackData.isEmpty()){ this.stackMin.push(newNum); }else if (newNum <= stackData.peek()){ this.stackMin.push(newNum); } this.stackData.push(newNum); } // pop /* 策略: 將stackData的棧頂元素與stackMin中棧頂元素做對比 * 1. 如果stackData棧為空,Exception. * 2. 如果stackData棧不為空, 【stackData的棧頂元素】== getMin(), 【stackMin】pop 操作 */ public int pop (){ if(this.stackData.isEmpty()){ throw new RuntimeException("Stack is empty"); } int value = this.stackData.pop(); if (value == this.getMin()){ this.stackMin.pop(); } return value; } public int getMin() { if (this.stackMin.isEmpty()){ throw new RuntimeException("Stack is empty"); } return this.stackMin.peek(); } } public static void main(String[] args) { myStack stack1 = new myStack(); stack1.push(3); System.out.println(stack1.getMin()); stack1.push(4); System.out.println(stack1.getMin()); stack1.push(1); System.out.println(stack1.getMin()); System.out.println(stack1.pop()); System.out.println(stack1.getMin()); } }
3 3 1 1 3