剑指Offer 22 栈的压入、弹出序列

题目

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。

思路

  1. 注意压入栈的元素可以随时弹出,因此弹出序列有多种;
  2. 创建一个辅助栈,按照压入序列向栈中压入元素;
  3. 每当压入一个元素时,如果这个元素刚好是弹出序列元素,那么直接弹出;如果不是,则把压栈序列中还没有入栈的数字压入辅助栈,直到栈顶元素为相应弹出序列元素;如果所有元素都压入栈而和按照弹出顺序的元素都不相等,说明该弹出序列不是该栈的弹出顺序。
  4. 初始条件:先往辅助栈stack中压入一个元素,初始化pushIndex为1,popIndex为0;
  5. 终止条件:当array2是array1的出栈顺序时,正常经过循环退出,此时array1和array2都遍历了一遍,pushIndex=popIndex=array.length;当array2不是array1的出栈顺序,此时array1的所有元素都压入stack,均不等于array[popIndex];
  6. 循环过程:比较栈顶元素和array2[popIndex],不相等则继续往里面压入元素,直到栈顶元素和array2[popIndex]相等或者已经将所有的元素压入stack,检查如果此时压入所有元素仍然不相等,返回false;正常情况下,此时栈顶元素和array2[popIndex]相等,将其弹出,并popIndex++,进行下一组循环。当整个循环正常结束,即pushIndex=popIndex=array.length时,返回true。
  7. 边界条件:
    输入的数组为null或者元素为0,或者两数组唱的不相等。
public class Q22IsPopOrder {
    public static boolean isPopOrder(int[] array1,int[] array2){
        if (array1==null||array1.length==0||array2==null||array2.length==0||array1.length!=array2.length)
            return false;
        Stack stack=new Stack();
        stack.push(array1[0]);
        int pushIndex=1;
        int popIndex=0;

        while (pushIndex<array1.length||popIndex<array2.length){
            while (stack.getTop()!=array2[popIndex]&&pushIndex<array1.length){
                stack.push(array1[pushIndex++]);
            }
            if (pushIndex==array1.length&&stack.getTop()!=array2[popIndex]) {
                return false;
            }
            stack.pop();
            popIndex++;
        }
        return true;
    }

    public static void main(String[] args) {
        int[] array1={1,2,3,4,5};
        int[] array2={4,5,3,2,1};
        int[] array3={4,3,5,1,2};
        System.out.println(isPopOrder(array1,array2));
        System.out.println(isPopOrder(array1,array3));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值