题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
分析
借用一个辅助栈来把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)保存起来,这样在弹出最小元素之后,可以获得下一个最小元素。
比如现在一次向栈中压入3, 4, 2, 1之后在连续两次弹出栈顶数字在压入0:
步骤 | 操作 | 数据栈 | 辅助栈 | 最小值 |
---|---|---|---|---|
1 | 压入3 | 3 | 3 | 3 |
2 | 压入4 | 3,4 | 3,3 | 3 |
3 | 压入2 | 3,4,2 | 3,3,2 | 2 |
4 | 压入1 | 3,4,2,1 | 3,3,2,1 | 1 |
5 | 弹出 | 3,4,2 | 3,3,2 | 2 |
6 | 弹出 | 3,4 | 3,3 | 3 |
7 | 压入0 | 3,4,0 | 3,3,0 | 0 |
代码:
import java.util.Stack;
public class Solution {
Stack dataStack = new Stack();
Stack minStack = new Stack();
public void push(int node) {
dataStack.push(node);
if(minStack.empty() || node < (int)minStack.peek()) {
minStack.push(node);
}
else {
minStack.push(top());
}
}
public void pop() {
if(!dataStack.isEmpty() && !minStack.isEmpty()) {
dataStack.pop();
minStack.pop();
}
}
public int top() {
return (int) minStack.peek();
}
public int min() {
if(!dataStack.isEmpty() && !minStack.isEmpty()) {
return top();
}else {
return (Integer) null;
}
}
//测试代码
public static void main(String[] args) {
Solution s = new Solution();
s.push(3);
System.out.println(s.min());
s.push(4);
System.out.println(s.min());
s.push(2);
System.out.println(s.min());
s.push(1);
System.out.println(s.min());
s.pop();
System.out.println(s.min());
s.pop();
System.out.println(s.min());
s.push(0);
System.out.println(s.min());
}
}