剑指offer-22.栈的压入、弹出序列

https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&tqId=11174&tPage=2&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

题解:
需要一个辅助桟,把输入的第一个序列中的数字依次压入该辅助桟,并按照第二个序列的顺序依次从该桟中弹出数字。

以弹出序列 4,3,5,1,2 为例分析压桟和弹出的过程。第一个希望被弹出的数字是4,因此 4 需要先压入到辅助桟里面。压入桟的顺序由压桟序列确定了,也就是在把4压入进桟之前,数字 1、2、3 都需要先压入到桟里面。此时桟里包含 4 个数字,分别是 1、2、3、4 ,其中4 位于栈顶。把 4 弹出之后,剩下的三个数字是 1、2和3、接下来希望被弹出的数字是5,由于它不是栈顶数字,因此我们接着在第一个序列中把4 以后的数字压入桟中,直到压入5。此时5 位于栈顶,被弹出,接下来希望被弹出的数字是 3,2,1 ,每次操作都位于栈顶,直接弹出。如果能完成整个过程,返回 true。

算法可以描述如下:

遍历 第二个序列,每次为当前要弹出的数字;
如果辅助桟不为空,且栈顶元素和当前要弹出的元素相等,则直接弹出;
否则需要在 第一个序列中查找,如果第一个序列已经查找到头了,且经过了前一步证明辅助桟顶也不是当前要弹出的元素,说明失败,返回false;
如果 第一个序列还可以查找,则在第一个序列中查找,并把途经元素都压入辅助桟。如果查找失败,返回false,如果查找成功,这直接压桟,并出栈。

如果 经历完上面的过程,此时辅助桟一定为空,说明成功,返回true,否则中途就返回false 了。

import java.util.Stack;
public class Solution {
    public boolean IsPopOrder(int[] pushA, int[] popA) {
        if (pushA.length != pushA.length) {
            return false;
        }
        if (pushA == null) {
            return true;
        }
        Stack<Integer> stack = new Stack();
        int index = 0;// index指向 pushA 数组
        for (int i = 0; i < popA.length; i++) { // 遍历popA[] 中元素
            if (!stack.isEmpty() && popA[i] == stack.peek()) {
                stack.pop();
            } else if (index >= pushA.length && !stack.isEmpty()) {// 如果index已经到头了,就不用在pushA[]里找了,只剩在桟中找了,经过上步后,说明当前桟顶元素和要匹配的元素不同,说明不匹配
                return false;
            } else {
                while (pushA[index] != popA[i]) {// 在pushA中找popA[i],路过的元素都压桟
                    stack.push(pushA[index]);
                    index++;
                    if (index >= pushA.length) {// 在pushA中没有找到 popA[i]
                        return false;
                    }
                }
                index++;// pushA 中找到了,index指向下一个位置,相当于压入桟后直接弹出
            }

        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/zxm1306192988/article/details/80981196