实现一个栈,该栈带有出栈(pop),入栈(push),取最小元素(getMin)3个方法。要保证3个方法的时间复杂度都是O(1)。
例如:
* 栈底-->栈顶
* 4,9,7,3,8,5
思路:
不能简单的通过在入栈的时候记录最小值来作为栈的最小元素。因为有可能在执行出栈操作后,最小值会被pop,从而找不到最小元素。
正确的思路:
-
- 创建一个备份栈,每次主栈push元素的时候,都和备份栈的栈顶元素作比较
- 主栈push的元素比备份栈栈顶元素小的,在push主栈的同时,将该元素也push到备份栈中;
- 主栈pop元素时,需要和备份栈栈顶元素比较,如果相等,需要将备份栈的栈顶元素也pop。
代码实现:
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Stack; 4 /** 5 * 实现一个栈,该栈带有出栈(pop),入栈(push),取最小元素(getMin)3个方法。 6 * 要保证3个方法的时间复杂度都是O(1) 7 * 8 * 栈底-->栈顶 9 * 4,9,7,3,8,5 10 */
11 public class MinStack { 12 private Stack<Integer> mainStack = new Stack<>(); 13 private Stack<Integer> minStack = new Stack<>(); 14 15 public void push (int element){ 16 mainStack.push(element); 17 if (minStack.empty() || element <= minStack.peek()){ 18 minStack.push(element); 19 } 20 } 21 22 public Integer pop(){ 23 if (mainStack.peek().equals(minStack.peek())){ 24 minStack.pop(); 25 } 26 return mainStack.pop(); 27 } 28 29 public Integer getMinElement(){ 30 if (!minStack.isEmpty()){ 31 return minStack.peek(); 32 }else { 33 return null; 34 } 35 } 36 37 public List<Integer> getStackElement(){ 38 List<Integer> elementList = new ArrayList<>(); 39 for (int i=0; i<mainStack.size(); i++){ 40 elementList.add(mainStack.get(i)); 41 } 42 return elementList; 43 } 44 45 46 public static void main(String[] args){ 47 MinStack stack = new MinStack(); 48 stack.push(4); 49 stack.push(9); 50 stack.push(7); 51 stack.push(3); 52 stack.push(8); 53 stack.push(5); 54 System.out.println(stack.getStackElement().toString()); 55 System.out.println("The min element is: "+ stack.getMinElement()); 56 System.out.println("pop start..."); 57 stack.pop(); 58 stack.pop(); 59 stack.pop(); 60 System.out.println("pop end..."); 61 System.out.println(stack.getStackElement().toString()); 62 System.out.println("The min element is: "+ stack.getMinElement()); 63 } 64 }
结果:
[4, 9, 7, 3, 8, 5] The min element is: 3 pop start... pop end... [4, 9, 7] The min element is: 4