栈应用:最小栈(第二题)
题目:
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素
分析:
1.每次压入两个元素,一个是元素本身,另外一个进行判断,是否为最小,即存放当前栈最小值,代码实现如下
1 /** initialize your data structure here. */ 2 public MinStack() { 3 stack = new Stack<Integer>(); 4 } 5 6 public void push(int x) { 7 if(stack.isEmpty()){ 8 stack.push(x); 9 stack.push(x); 10 }else{ 11 int tmp = stack.peek(); 12 stack.push(x); 13 if(tmp<x){ 14 stack.push(tmp); 15 }else{ 16 stack.push(x); 17 } 18 } 19 } 20 21 public void pop() { 22 stack.pop(); 23 stack.pop(); 24 } 25 26 public int top() { 27 return stack.get(stack.size()-2); 28 } 29 30 public int getMin() { 31 return stack.peek(); 32 }
为什么对着java版写不出来c++的呢?因为c++的stack类里面只有top()回栈顶,不能访问别的
2.用两个栈实现,一个压元素,一个压最小值,代码实现如下:
1 class MinStack { 2 public: 3 stack<int> data; 4 stack<int> minstack; 5 /** initialize your data structure here. */ 6 MinStack() { 7 8 } 9 10 void push(int x) { 11 data.push(x); 12 if(minstack.empty() || x <= minstack.top()){ 13 minstack.push(x); 14 } 15 } 16 17 void pop() { 18 if(data.top() == minstack.top()){ 19 minstack.pop(); 20 } //进行判断的原因很简单,data里面没有,对应的minstack里面也不应该存在 21 data.pop(); 22 } 23 24 int top() { 25 return data.top(); 26 } 27 28 int getMin() { 29 return minstack.top(); 30 } 31 };
posted on 2019-04-15 20:54 imyourterminal 阅读(273) 评论(0) 编辑 收藏 举报