题目:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
要求:
1、pop、push、getMin操作的时间复杂度都是O(1)
2、设计的栈类型可以输用现成的栈结构
解答:
借助另一个栈,记录stackData栈中的最小元素,【stackMin 栈保存最小元素】
import java.util.Stack; public class Problem001_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的栈顶元素与getMin() * 1. 如果stackMin栈为空,将【newNum】push到stackMin * 2. 如果stackMin栈不为空,newNum < 【getMin()】, 将newNum push 至 stackMin value = 【stackMin的栈顶元素】, push value 至 stackMin */ public void push (int newNum){ if (this.stackData.isEmpty()){ this.stackMin.push(newNum); }else if (newNum <this.getMin()){ this.stackMin.push(newNum); }else { int value = this.stackMin.peek(); this.stackMin.push(value); } this.stackData.push(newNum); } // pop /* 策略: * 1. 如果stackData栈为空,Exception. * 2. 如果stackData栈不为空, 【stackData】【stackMin】pop 操作 */ public int pop (){ if(this.stackData.isEmpty()){ throw new RuntimeException("Stack is empty"); } this.stackMin.pop(); return this.stackData.pop(); } 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