我们常见的一类如栈出栈的题目就是这种,那我们肯定是先从定义下手
栈就相当于一个只有一个口的盒子,我们先放进去的东西在底层只能后拿出来,相反的,后放进去的东西在上层,我们可以直接取出,这就是栈的特性“先进后出,后进先出”。
那么接下里我们直接入手案例:
序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是否是该压栈序列对应的一个弹出序列
答案是:是的
因为顺序可能是,先压入1,2,3,4,然后弹出队首元素4,此时再次压入5,然后依次弹出栈中的元素,此时的出栈顺序就是4,5,3,2,1
再举一个反例:
序列1,2,3,4,5是某栈的压入顺序,序列4,3,5,1,2是否是对应的弹出序列
这个问题的答案是:否
按照刚刚的思路来的话就是,1,2,3,4入栈,然后4,3依次出栈,5入栈后栈中元素自底向上依次是1,2,5,所以5出栈后不可能是1出栈,因为此时的栈顶元素是2
总结
从上面的案例中,我们可以总结出一个规律:
每一个栈中元素出栈时机都有两种:
1.序列中间的某一个元素刚入栈就出栈,此时我们可以依次出栈或继续将后面元素入栈。
2.序列中的元素全部入栈后,栈顶元素依次出栈
所以:
当我们确定一个出栈元素后,后面出栈的元素中 <在该元素之前入栈> 的元素的出栈顺序必须与入栈时的顺序相反,否则该出栈序列不可能是该入栈序列的出栈序列。
最后附上java代码
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
int i=0;
Stack<Integer> stack= new Stack<>();
for(int item : pushA){
stack.push(item);
while(!stack.empty() && stack.peek()==popA[i]){
stack.pop();
i++;
}
}
return stack.empty();
}
}