最小栈打卡
题目描述
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
思路分析
这是力扣的第155题,那么这一题我们可以使用同步栈和非同步栈的方式进行
1. 同步栈
我们使得辅助栈存储元素和已有的栈存储元素的个数一样的,只是说辅助栈存储的是当前的最小的元素,这样在后面进行最小元素的获取的时候才可以获得最小的值!
代码展示
class MinStack {
//
private Stack<Integer> data;
private Stack<Integer> helper;//辅助栈
public MinStack() {
data=new Stack<>();
helper=new Stack<>(); //我们使用辅助栈来表示当前的最小的元素
}
public void push(int val) {
data.add(val);
if(helper.isEmpty()||helper.peek()>val){
helper.add(val);
}
else{
helper.add(helper.peek());
}
}
public void pop() {
data.pop();
helper.pop();
}
public int top() {
if(!data.isEmpty()){
return data.peek();
}
throw new RuntimeException("栈中元素为空,此操作非法");
}
public int getMin() {
if(!helper.isEmpty()){
return helper.peek();
}
throw new RuntimeException("栈中元素为空,此操作非法");
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
2. 不同步栈
我们只在存在元素小于辅助栈的栈顶或者为空的时候才将元素添加进去,这样就会节省一部分空间
新来的数小于或者等于辅助栈栈顶元素的时候,才放入,特别注意这里“等于”要考虑进去,因为出栈的时候,连续的、相等的并且是最小值的元素要同步出栈;
代码展示
class MinStack {
//
private Stack<Integer> data;
private Stack<Integer> helper;//辅助栈
public MinStack() {
data=new Stack<>();
helper=new Stack<>(); //我们使用辅助栈来表示当前的最小的元素
}
public void push(int val) {
data.add(val);
if(helper.isEmpty()||helper.peek()>=val){
helper.add(val);
}
}
public void pop() {
if(!data.isEmpty()){
int vals=data.pop();
if(vals==helper.peek())
helper.pop();
}
}
public int top() {
if(!data.isEmpty()){
return data.peek();
}
throw new RuntimeException("栈中元素为空,此操作非法");
}
public int getMin() {
if(!helper.isEmpty()){
return helper.peek();
}
throw new RuntimeException("栈中元素为空,此操作非法");
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
对了,上面的题目如果将pop处的代码修改为
public void pop() {
if(!data.isEmpty())
{
if(data.peek() == helper.peek()){
helper.pop();
}
data.pop();
}
}
就会出现错误,原因是:
两个
peek()
方法返回的都是 Integer 类型 ,它们的比较不能用==
,因为==
用于包装类型(它们都是对象)的比较,比较的是它们的内存地址,解决方法也很简单:(1)改用equals()
方法,(2)至少把其中一个变量转成 int 型。
好了,这个题目就记录到这里,然后我们来学习一下栈的一些知识
Stack
最后放上一张好看的图片!