栈的压入、弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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;
    }
}
点赞