1.题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
示例:
输入:[1,2,3,4,5],[4,5,3,2,1]
返回:true
输入:[1,2,3,4,5],[4,3,5,1,2]
返回:false
2.题解
方法1
思路分析:
判断两个序列是否符合入栈、出栈的次序,我们可以使用一个栈来模拟。
入栈:栈顶元素不等于出栈序列当前元素
出栈:栈顶元素等于出栈序列当前元素
具体过程:
具体实现:
1.创建一个栈,来模拟入栈、出栈次序
2.使用i、j来遍历pushV、popV数组,i < pushV.length,入栈
3.栈顶元素等于popV数组当前元素时,出栈
4.遍历完pushV数组后,判断栈是否为空,栈为空,弹出序列为正确的出栈顺序;反之,则为错误的出栈顺序
代码实现:
public class Solution { public boolean IsPopOrder (int[] pushV, int[] popV) { Stack<Integer> stack = new Stack<>(); int j = 0; for (int i = 0; i < pushV.length; i++) { stack.push(pushV[i]); //判断是否有元素出栈 while(j < popV.length && !stack.empty()){ int k = stack.peek(); if(k == popV[j]){ stack.pop(); j++; }else{ break; } } } return stack.empty(); } }
方法2
思路分析:
由于数组本身就可用于实现栈,我们可以将pushV数组当作栈,使用p来标记栈顶,
入栈:pushV[p](栈顶元素)不等于当前出栈数组中元素,p++(入栈)
出栈:pushV[p](栈顶元素)等于当前出栈数组中元素,p--(出栈)
具体过程:
具体实现:
1.使用p来标识栈顶元素
2.使用i、j来遍历pushV、popV数组,pushV[p](栈顶元素)不等于当前出栈数组中元素,
pushV[p] = pushV[i],p++
3.pushV[p](栈顶元素)等于当前出栈数组中元素,p--
4.遍历完pushV数组后,判断p的大小,若p为0,则表示所有元素都已出栈,出栈序列为正确的出栈顺序,返回true,否则,返回false
代码实现:
public class Solution { public boolean IsPopOrder (int[] pushV, int[] popV) { int p = 0;//标识栈顶 int j = 0;//出栈序列下标 for(int n : pushV){ pushV[p] = n; while( p>=0 && j < popV.length && pushV[p] == popV[j]){ j++; p--; } p++; } return p==0; } }
题目来自: