实现一个最小栈(简单难度)
题目概述(简单难度)
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
-
push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。
示例:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
题目链接:
思路与代码
思路展现
1:首先定义一个空栈stack和一个最小栈minStack 我们的stack这个栈是用于存储当前所有元素的,而我们的minStack是用于存储stack中每次插入时的最小元素的. 2:现在我们给定一组元素:3,-1,2,4 首先将我们的3进行入栈操作,因为stack中此时为空,那么3在stack这个栈中算是最小的元素了,所以当3入到stack这个栈中后,minStack这个栈也要将3这个元素入进去,如下所示: 3:此时继续将-1入到stack栈中,-1此时小于3,那么-1这个元素要入到我们的minStack当中去,如下图所示: 4:此时继续将2这个元素入到stack栈中去,然后将2和minStack的栈顶元素-1进行大小的判断,此时2大于-1,那么就将2这个元素不入到minStack中,如下图所示: 5:此时继续将4这个元素入到stack栈中去,然后将4和minStack的栈顶元素-1进行大小的判断,此时4大于-1,那么就将4这个元素不入到minStack中,如下图所示: 6:欧克入栈的操作就是这些,下面我们来说下出栈操作 stack中的每个元素在进行出栈操作的时候,都需要将每个出栈的元素与minStack的当前栈顶元素进行比较,如果两者相同,就全部都出栈,如果两者不相同,就只出stack栈中的元素即可. 下面给出代码示例:
代码示例
class MinStack {
//定义两个栈,stack和minStack
private Stack<Integer> stack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public MinStack() {
}
public void push(int val) {
stack.push(val);
if(minStack.isEmpty()) {
//先将第一个元素放入stack2当中
minStack.push(val);
}else {
//注意这块需要写等于号
if(val <= minStack.peek()) {
minStack.push(val);
}
}
}
public void pop() {
int x = stack.pop();
if(x == minStack.peek()) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
注意在push方法中我们有一个if语句是用于判断当前所要插入stack中的元素跟我们用于存储最小元素的minstack的栈顶元素谁大谁小的判断的语句,意思就是说假如我们要插入的元素大于我们当前minstack的栈顶元素的时候,就不插入到minstack当中去了,否则当小于等于当前minstack的栈顶元素的时候,就选择插入进去.我这里就没有考虑到等于的情况,光考虑到小于的情况了,所以就出现了错误:报了以下警告…
大家可以自己模拟一下为什么是要小于等于而不是小于,拿我们OJ所给的例子自己模拟一下就知道啦.这种小细节以后还需注意.
总结
考察对于栈的掌握
