题目
解题
这道题本来是打算用栈然后加一个标记位,这个标记位存最小的数,但是之后发现解决不这种情况:
1、弹出以后,这个标记怎么办,没法回溯
那么就得换一个数据结构,比如额外放一个线性表,里面元素从小到大排列,原栈插入元素后同步到线性表里,弹栈时从这里相应去除掉
但是想到这样还需要很多操作,就想简化一下,如果用一个额外栈,每次入栈时:
1、比额外栈顶更小或一样的就入额外栈
2、更大就(实际更大的元素存在了原栈栈顶,弹出顺序上一定是早于那些之前的小元素的,不需要考虑这些更大元素在比它小的元素弹出后变成了最小元素)
那么弹栈时分情况:
1、如果不在额外栈顶,那么额外栈不动
2、如果在额外栈,就弹出额外栈顶
取最小就拿额外栈顶就好
实现的时候有一个空栈异常,这里是因为最小栈开始是空的,取不到栈顶元素
这里用==null似乎不行,看源码里是empty判断空的
之后输出有错误
因为这里写的不严谨,先弹出后进行比较
改后
之后又
这里估计还是弹栈的问题,如果先获取值,再弹,再用值比,就可以了,源码里pop实际就返回了栈顶值
修改后完整代码
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
this.stack = new Stack();
this.minStack = new Stack();
}
public void push(int val) {
this.stack.push(val);
if(minStack.empty()||val<=minStack.peek()){
minStack.push(val);
}
}
public void pop() {
int value = this.stack.pop();
if(value==this.minStack.peek()){
this.minStack.pop();
}
}
public int top() {
int x = this.stack.peek();
return x;
}
public int getMin() {
int m = this.minStack.peek();
return m;
}
}
如此提交后