题目描述:
设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。
- push(x) – 将元素 x 推入栈中。
- pop() – 删除栈顶的元素。
- top() – 获取栈顶元素。
- getMin() – 检索栈中的最小元素。
示例:
- MinStack minStack = new MinStack();
- minStack.push(-2);
- minStack.push(0);
- minStack.push(-3);
- minStack.getMin(); --> 返回 -3.
- minStack.pop();
- minStack.top(); --> 返回 0.
- minStack.getMin(); --> 返回 -2.
思路:
首先,我们需要明确,一般情况下,栈的特点和基本操作。
- 栈的特点是先入后出,用于倒序特别方便,比如,对链表进行逆序操作;
- 在java中,栈的导入是import java.util.Stack;
- 在java中,栈的实例化(以整形为例) Stack<Integer> stack = new Stack<Integer>();
- 在java中,栈的基本操作如下:
- push—插入元素;
- pop()–取出栈顶的元素
- peek()–查看栈顶元素,并不取出
- isEmpty()—查看栈是否是空的
接着,在本题中,需要完成的功能有
- push–含义和原来的一样,暂时不需要进行特别处理
- pop—含义和原来的一样,暂时不需要进行特别处理
- top—含义和原来的peek一样,暂时不需要进行特别处理
- getMin—新的功能,需要考虑怎么处理,最简单的思路,再建立一个栈,保存最小的元素,如果要返回最小元素,那么直接从辅助栈中返回最小元素。
那么,可以考虑,在之前的三个功能中,只要操作对象不是最小元素,那么就不需要进行更改。考虑重新对所有操作进行分析
- push–如果第一次添加元素(数据栈和辅助栈都是空),那么这个元素也是目前的最小值,直接同时添加到辅助栈和数据栈,如果不是第一次添加元素(符篆栈里面存放着最小值),那么对于数据栈,就直接插入元素,对于辅助栈,要判断待添加的元素和已经存放的最小值谁最小,如果原来的最小,那么就不需要什么操作,否则,将待添加的元素压入栈
- pop—对于数据栈,是一样的,对于辅助栈,如果数据栈弹出的元素和辅助栈栈顶的元素是一样的,那么辅助栈也弹出,否则,不对辅助栈做操作
- peek–和辅助栈没关系
- getMin()—返回辅助栈的栈顶元素;
代码:
import java.util.Stack;
class MinStack {
// 数据栈
private Stack<Integer> data;
// 辅助栈
private Stack<Integer> helper;
/** initialize your data structure here. */
public MinStack() {
data = new Stack<Integer>();
helper = new Stack<Integer>();
}
public void push(int x) {
if(data.isEmpty()){
data.push(x);
helper.push(x);
}else{
data.push(x);
int min_val = helper.peek();
if (x<min_val){
helper.push(x);
}
}
}
public void pop() {
int temp = data.pop();
if(temp==helper.peek()){
helper.pop();
}
}
public int top() {
return data.peek();
}
public int getMin() {
return helper.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/