上篇文章,我们介绍了一些经典例题,本篇文章,我们将继续讲解例题,来加深理解~觉得小编讲的还可以的可以留个关注支持一下~话不多说,上正文~
1. 出栈入栈次序匹配
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
我们借助图片理解
此时我们返回true即可
1.我们定义i j两个下标,遍历数组
2.让i往栈里放,此时就将栈顶的元素与j对比,看看是不是跟j相等,如果不相等,i就往后走,直到相等时候,如图
3.此时就可以弹出栈顶元素,并且j++,
如图
此时相等,继续出栈 ,如图
以此类推,这里直接看最后结果,
以上是匹配的情况,下面,我们再来介绍一个不匹配的情况
4.最后我们只需看栈是否为空即可
代码如下
public boolean IsPopOrder (int[] pushV, int[] popV) {
Stack<Integer> stack = new Stack<>();
int j = 0;
int [] pushA = {};
int [] popA = {};
for (int i = 0; i < pushA.length; i++) {
stack.push(pushA[i]);
while (!stack.empty()&&j <popA
.length&&stack.peek() == popA[j]){
stack.pop();
j++;
}
}
return stack.empty();
}
2.最小栈
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
入栈
1.定义两个栈,一个作为正常栈,一个用来存放最小值,也就是说,最小栈每次入栈都要和栈顶元素比较,如果比栈顶元素小,就要入栈,注意:也就是说,第一次入栈操作,两个栈都要进行入栈,如图
此时,最小值栈的栈顶,就是最小值
那么,出栈操作呢?
普通栈正常出栈,但每次出栈都要跟最小栈栈顶元素进行比较,如果正常栈的元素等于最小栈栈顶的元素,那么最小栈也要进行出栈操作,如图
代码如下
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
this.stack = new Stack<>();
this.minStack = new Stack<>();
}
public void push(int val) {
stack.push(val);
if (minStack.empty()){
minStack.push(val);
}else {
if (val <= minStack.peek()){
minStack.push(val);
}
}
}
public void pop() {
if (!stack.empty()){
int ret = stack.pop();
if (minStack.peek() == ret){
minStack.pop();
}
}
}
public int top() {
if (stack.empty()){
return -1;
}
return stack.peek();
}
public int getMin() {
if (minStack.empty()){
return -1;
}
return minStack.peek();
}
}
此时,我们栈的例题就到此结束 了,下一篇文章我们将会进入队列的学习,敬请期待吧~