本题来源于牛客网中,链接如下:[编程题]栈的压入、弹出序列
1.题目要求
题目展示:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
0<=pushV.length == popV.length <=1000
-1000<=pushV[i]<=1000
pushV 的所有数字均不相同
输入描述:
两组数组数据
输出描述:
true或者false
示例1:
输入:
[1,2,3,4,5],[4,5,3,2,1]
返回值:true
说明:
可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true
2.解题思路
【题目解析】:
这道题目考的就是栈的压入、弹出序列,也就是栈的特性,在平时我们都会看见类似这种的选择题,只需要试一下对比一下就可以得到答案了,而代码也是一样,循环对比,就可以解出来了,首先我们了解一下这种类型的题目:
这种就是选择题类型的,在做这些题目之前我们需要先了解栈的特性:
栈的元素是先入后出的,并且随时可以选择存或者取。
所以这道题目中,答案是C:
比如1选项中的,是可以把A B C D E都存储,然后再取的时候,根据先入后出的顺序,就是E D C B A
了,所以1可以。
然后对于2选项,我们是先存A B C D,然后取出D C
,然后放E取E
,最后再取出B A
,顺序也是可以的D E C B A
,选项2正确。
对于选项3这种,先存A B C D,然后取出D C
,然后放E取E
,最后取的时候,根据先入后出顺序,并不可能在取出B之前能取出A,所以选项3错误。
选项4也是一样可以的。
【解题思路】:
所以对于这种题目的解题思路,基本上是和选择题一样的,对于入栈顺序和出栈顺序的两个数组,我们用循环来对比,先按入栈顺序往栈上放一个元素,然后看出栈顺序的第一个是否和栈顶元素一致,如果一样就出栈,不一样就继续按入栈顺序放下一个元素。一直对比,直到入栈放完,也就是循环结束,判断栈中是否还有元素,有就是没出完,也就是这种出栈方法不可能,没有则是可以完成的顺序。
注意:我们在出栈的时候,可能出完一个之后下一个出栈元素也在栈上了,所以在判断出栈的时候可以用while循环。
3.参考代码
import java.util.*;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> stack = new Stack<>();
//创建栈
int j = 0;
for (int i = 0; i < pushA.length; i++) {
stack.push(pushA[i]);//入栈
while(j<popA.length && !stack.empty() && stack.peek() == popA[j]){
//判断下标不越界以及栈不为空的情况下,看栈顶元素是否和出栈元素一致
stack.pop();//一致就出栈
j++;//有请下一位出栈者
}
}
return stack.empty();//最后判断栈是否为空
}
}