题目描述
设计一个支持 push,pop,top 操作,并能检索到最小元素的栈,
时间复杂度o(1)
push(x) 将元素x推入栈中
pop() 删除栈顶的元素
top() 取栈顶元素
getMin() 检索栈中的最小元素
图解法
根据这个思路立刻可以得到如下的错误代码
public void pushError(int x) {
int Min=0;
//如果有负数,赋予初值时赋予一个极小值就可以了
if(normal.empty()) {
normal.push(x);
min.push(x);
Min=x;
}
else {
if(x<=Min) {
normal.push(x);
min.push(x);
Min=x;
}
else {
normal.push(x);
min.push(Min);
}
}
}
哪里出现了问题呢?是的刚刚图解的时候没有考虑到这个Min的值,由于每次重新调用一遍方法,无法记录前一次Min
的值,做出
如下调整
下面对代码进行改进,处理Min的问题
//总结:如何解决,需要调用前一次遍历Min的值,与x进行比较,却由于每次方法运行完毕都会销毁,无法保存Min的值
//解决方法:采用每一次先记录第二个栈min.peek()的值,再用之前的方法进行比较
public void push(int x) {
//因为每一次normal都需要push,就调整到最前面
normal.push(x);
if (min.empty()) {
//min.empty的情况就是上面图画的第一种遍历情况,min的栈中push();
min.push(x);
} else {
//分为两种情况讨论,如果给定值小,就push给定值,如果给定值大,就push(Min)
//首先记录Min的值,为了区别上一个错误示范,这里用m来表示最小值的记录
int m = min.peek();
if (x <= m) {
min.push(x);
} else {
min.push(m);
}
}
}
完整代码如下所示
package test_821;
import java.util.Stack;
class MinStack {
Stack<Integer> normal = new Stack<>();
Stack<Integer> min = new Stack<>();
public MinStack() {}
//根据图片你可能会写出这样一个白话文
//显然直接这么写有一个问题就是Min的值每次都会被销毁
public void pushError(int x) {
int Min=0;
//如果有负数,赋予初值时赋予一个极小值就可以了
if(normal.empty()) {
normal.push(x);
min.push(x);
Min=x;
}
else {
if(x<=Min) {
normal.push(x);
min.push(x);
Min=x;
}
else {
normal.push(x);
min.push(Min);
}
}
}
//下面对代码进行改进,处理Min的问题
//总结:如何解决,需要调用前一次遍历Min的值,与x进行比较,却由于每次方法运行完毕都会销毁,无法保存Min的值
//解决方法:采用每一次先记录第二个栈min.peek()的值,再用之前的方法进行比较
public void push(int x) {
//因为每一次normal都需要push,就调整到最前面
normal.push(x);
if (min.empty()) {
//min.empty的情况就是上面图画的第一种遍历情况,min的栈中push();
min.push(x);
} else {
//分为两种情况讨论,如果给定值小,就push给定值,如果给定值大,就push(Min)
//首先记录Min的值,为了区别上一个错误示范,这里用m来表示最小值的记录
int m = min.peek();
if (x <= m) {
min.push(x);
} else {
min.push(m);
}
}
}
public void pop() {
normal.pop();
min.pop();
}
public int top() {
return normal.peek();
}
public int getMin() {
return min.peek();
}
}