题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解题方案
本题的解题思路在于我们如何将压栈弹出进行比较,这里我使用了一个辅助栈,首先判断压入栈的数与弹出栈的数比较,若相同则判断当前辅助栈的栈顶和弹出栈的数是否相同(相同则内部继续循环判断,直到当前栈顶的数与弹出栈的数据不同或栈为空则跳出循环),若不相同则将该数压入辅助栈中,最后再将弹出栈的数据与辅助栈弹出的顺序进行对比,一旦出现不同则返回false,最后都通过后再返回true。
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
//声明一个辅助栈用于存储当前数组的压栈顺序
Stack<Integer> stack = new Stack<Integer>();
//用于存储弹出顺序的数组下标
int j = 0;
//用于判断压入数据和弹出(即找到入栈后立即弹出的数,将其他数据存储到辅助栈中)
for(int i=0;i<pushA.length;i++){
//如果压栈的数等于弹出的第一个出口则将弹出数组中的下标后移
if(pushA[i] == popA[j]){
j++;
if(j == popA.length)
return true;
//这里可能会出现如下弹出结果,需要在这里处理
//压栈:12345 弹栈:32451
//其中可能会出现弹出3之后并且向前弹出2,所以这里需要判断辅助栈的栈顶是否与弹栈的下一个数相同,所以这里使用了while循环语句
while(stack.peek() == popA[j]){
//当前辅助栈中的数与弹栈的下一个数相同,所以这里将数弹出,并且将弹栈的数组下标向后移动
stack.pop();
j++;
//这里用于判断当前辅助栈中是否还有数,如果没有的话则跳出该循环
if(stack.size() == 0)
break;
}
continue;
}else{
//这里代表当前入栈数据并没有一入栈就弹出
stack.push(pushA[i]);
}
}
//这里代表的是数压栈后没有立即弹出的压栈数
if(j <= 4){
//按照弹出栈的顺序进行判断该栈是否满足其弹栈顺序
for(int i=j;i<popA.length;i++){
//判断当前弹出顺序是否与辅助栈的弹出顺序是否一致,不一致则返回false
if(stack.pop() != popA[i]){
return false;
}
}
}
return true;
}
}