• 剑指Offer对答如流系列


    面试题31:栈的压入、弹出序列

    题目描述

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

    例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。

    问题分析

    这里要利用栈先进先出的特点,所以我们干脆建立一个栈(当然你用数组也是OK的),按照压栈序列依次进行入栈操作,按出栈序列的顺序依次弹出数字。

    我们直接使用上面题目描述举的例子

    序列1、2、3、4、5是某栈的压栈序列

    序列4、5、3、2、1是该压栈序列对应的一个弹出序列

    我们在元素压栈期间,随时有元素出栈。这个时候在出栈时,若下一个要出栈的数字与栈顶数字相同则弹出,否则则入栈。

    当到元素4的时候,需要出栈。
    在这里插入图片描述

    然后到元素5压栈,接着继续判断是否出栈,依次进行下去,如果最后栈为空,说明所有元素出栈成功,代表两个序列匹配。
    在这里插入图片描述

    如果压栈序列中的所有数字都入栈后没有完全出栈成功则代表两个序列不匹配,返回false。

    三、问题解答

        public boolean isPopOrder(int [] pushA,int [] popA) {
            if(pushA==null || popA==null) {
                return false;
            }
            Stack<Integer> stack = new Stack<Integer>();
            //提前判断长度是否相等
            if(popA.length != pushA.length || pushA.length==0) {
                return false;
            }
            int popIndex=0;
            for(int pushIndex = 0; pushIndex < pushA.length; pushIndex++) {
                stack.push(pushA[pushIndex]);
                while(!stack.empty() && stack.peek()==popA[popIndex]) {
                    stack.pop();
                    popIndex++;
                }
            }
            return stack.empty();
        }
    
  • 相关阅读:
    Intellij IDEA13 创建多模块Maven项目
    oracle锁
    oracle rac负载均衡
    awk命令
    政务外网、政务专网、政务内网和互联网
    图片切换实现选中-未选中效果
    生成带logo 的二维码
    控制input为number时样式
    移动端适配的解决方法?
    input-checkbox选中及非选中样式设置
  • 原文地址:https://www.cnblogs.com/JefferyChenXiao/p/12246394.html
Copyright © 2020-2023  润新知