微软算法100题02 设计包含min函数的栈

要求:
1. 定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素
2. 要求函数 min、push 以及 pop 的时间复杂度都是 O(1)

 

思路: 构建一个辅助栈, 只有当前入栈的数据小于该辅助栈的栈顶元素时,才将其push到辅助栈, 保证辅助栈的栈顶元素总为最小,当出栈时,如果出栈元素大于辅助栈栈顶元素,则该元素必然不在辅助栈中,因为辅助栈保留了原始栈的入栈顺序(只按大到小存储 舍弃了一些元素), 该较大元素在入栈时就已经被辅助栈过滤掉了,如果出栈元素小于或等于辅助栈栈顶元素,则辅助栈也进行pop操作

 

 1 package com.rui.microsoft;
 2 
 3 import java.util.Stack;
 4 
 5 public class Test02_MinStack {
 6 
 7     public static void main(String[] args) {
 8         MyStack myStack = new MyStack();
 9         myStack.push(5);
10         myStack.push(3);
11         myStack.push(1);
12         myStack.push(6);
13         
14         System.out.println(myStack.min());
15         
16         myStack.pop();
17         System.out.println(myStack.min());
18         
19         myStack.pop();
20         System.out.println(myStack.min());
21         
22     }
23     
24     static class MyStack{
25         private Stack<Integer> stack = new Stack<Integer>();
26         private Stack<Integer> minStack = new Stack<Integer>();
27         
28         public void push(int i){
29             stack.push(i);
30             
31             if(minStack.isEmpty()){
32                 minStack.push(i);
33             }else{
34                 int min = minStack.peek();
35                 //minStack only push item smaller than its top item
36                 //minStack只入栈比其栈顶元素小的元素
37                 if(i < min){
38                     minStack.push(i);
39                 }
40             }
41         }
42         
43         public Integer pop(){
44             Integer i = stack.pop();
45             //when pop an item from original stack
46             //we need to process the minStack also
47             //if the item popped from original stack is larger than minStack's top item
48             //it means this item should not exist in minStack
49             if(i <= minStack.peek()){
50                 minStack.pop();
51             }
52             return i;
53         }
54         
55         public Integer min(){
56             return minStack.peek();
57         }
58     }
59 }

 

posted @ 2015-10-20 18:06  蟹粉小笼包  阅读(285)  评论(0编辑  收藏  举报