实现一个最小栈

实现一个栈,该栈带有出栈(pop),入栈(push),取最小元素(getMin)3个方法。要保证3个方法的时间复杂度都是O(1)。

例如:

  * 栈底-->栈顶
  * 4,9,7,3,8,5

思路:

  不能简单的通过在入栈的时候记录最小值来作为栈的最小元素。因为有可能在执行出栈操作后,最小值会被pop,从而找不到最小元素。

  正确的思路: 

    1. 创建一个备份栈,每次主栈push元素的时候,都和备份栈的栈顶元素作比较
    2. 主栈push的元素比备份栈栈顶元素小的,在push主栈的同时,将该元素也push到备份栈中;
    3. 主栈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

猜你喜欢

转载自www.cnblogs.com/zldmy/p/11486681.html