面试题:包含min函数的栈
题目:定义栈的数据结构。请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都为O(1)
思路:
1. 最开始的思路:用一个辅助变量存储最小值——在最小值也被弹出的时候无法得知次小值
2. 之后的思路:用一个栈,存储每次push时的新最小值,如果没有更新,就不压入辅助栈——如果连续都是相同的最小值,则弹出一个值之后,辅助栈中就没有数了
3. 最后(也是书上)的思路:用一个辅助栈,存储每次push时的最小值(不论是不是新的值),弹出值时辅助栈也同时弹出
三个方法:pop push和min
pop:如果不为空,直接pop
push:如果为空,直接push;如果不为空,比较minstack的顶部元素(最小值)与当前输入,如果当前输入更小,则压入当前数;如果原始min更小,则压入原始最小值
min:返回minstack顶部元素
public class minStack {
Stack<Integer> stack;
Stack<Integer> minstack;
minStack(){
stack = new Stack<Integer>();
minstack = new Stack<Integer>();
}
public void pop() {
int s;
if(!stack.empty()) {
minstack.pop();
s = stack.pop();
System.out.printf("pop:%d\n",s);
}else {
System.out.println("empty stack");
}
}
public int min() {
if(!stack.empty()) {
return minstack.peek();
}
return 0;
}
public void push(int x) {
stack.push(x);
if(!minstack.empty()){
int min = minstack.peek();
if(x<min) {
minstack.push(x);
}else {
minstack.push(min);
}
}else {
minstack.push(x);
}
}
}