文章目录
题目描述:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
简单分析:
通过读题我们不难发现,本题要求是找栈中最小的元素,即就是在栈中弹出一个最小值后,还可以找到栈中存在的最小值。这里的思路也不难理解,题目要求要找到最小值,呢么,我们可以专门定义一个栈来存储某一刻所对应的最小值,围绕这一点来实现代码。
代码试现
class MinStack {
private Stack<Integer> stack1;
private Stack<Integer> minStack;
public MinStack() {
stack1 = new Stack<>();
minStack = new Stack<>();
}
public void push(int val) {
stack1.push(val);
if(minStack.empty()){
minStack.push(val);
}else{
//查看最小栈中存储的栈顶元素,与此时存入的val比较
int x = minStack.peek();
if(val <= x){
minStack.push(val);
}
}
}
public void pop() {
if(!stack1.empty()){
int x = stack1.pop();
if(x == minStack.peek()){
minStack.pop();
}
}
}
public int top() {
if(!stack1.empty()){
return stack1.peek();
}
return -1;
}
public int getMin() {
if(!minStack.empty()){
return minStack.peek();
}
return -1;
}
}
详细分析
这里需要两个栈,一个存储所有元素,一个存储在每一时刻时的元素。
所以,先定义两个栈。
1.push方法
这里用示例中的3个数字举例。
2.pop方法
这里是要弹出stack1中的栈顶元素,同样的,为了保证minStack中栈顶存储的是当前栈中最小的元素,所以,当弹出的栈的值等于minStack栈顶的值时,minStack同样要弹出。
3.top方法
这里的 top 方法由题可知是 stack1 栈顶元素的查看方法。
4.getMin 方法
这里 getMin 方法由题可知是 minStack 栈顶元素的查看方法。