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

发布于 2024-07-15 13:57:34 字数 2862 浏览 13 评论 0

题目

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

假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

解析

还是两种思路,都要借助一个额外的栈。

1、思路一

先看过程:

  • 遍历 pushA ,使用一个索引 popIndex 下标记录 popA 走到的位置,如果 pushA[i] = popA[popIndex] ,就 popIndex++ (不处理);
  • 否则(不相等),就入栈 pushA[i]
  • 最后全部弹栈,每弹一个,就看 stack.pop() == popA[popIndex] ,如果不等,就返回 false ,否则返回 true

看下面这个例子就一目了然了。

代码:

import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int[] pushA, int[] popA) {
        Stack<Integer> stack = new Stack<>();
        int popIndex = 0;
        for (int i = 0; i < pushA.length; i++) {
            if (pushA[i] == popA[popIndex])
                popIndex++;
            else
                stack.push(pushA[i]);
        }
        while (!stack.isEmpty()) {
            if (stack.pop() != popA[popIndex++])
                return false;
        }
        return true;
    }
}

2、思路二

其实也差不多。

  • 还是使用一个栈,首先不管,遍历 pushA[i] 的时候先将 pushA[i] 入栈;
  • 然后判断栈 stack 中元素的栈顶( stack.peek() ) 和 pop[popIndex] 是否相等,如果一直相等就一直弹栈( while ),且 popIndex++
  • 最后看栈是否为空即可;

也看一个例子。

  • 首先 1stack ,此时栈顶 1!=4
  • 继续入栈 2 ,此时栈顶 2!=4 ,继续入栈 3 ,此时栈顶 3!=4
  • 继续入栈 4 此时栈顶 4==4 ,出栈 4弹出序列向后一位popA[popIndex] 此时为 5
  • 继续入栈 5 ,此时栈项 5=5 ,出栈 5 ,弹出序列向后一位,此时为 3 , 辅助栈里面是 1,2,3 ,然后后面的是 3,2,1 正好满足;

代码

import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int[] pushA, int[] popA) {
        Stack<Integer> stack = new Stack<>();
        int popIndex = 0;
        for (int i = 0; i < pushA.length; i++) {
            stack.push(pushA[i]);  //先入栈
            while (!stack.isEmpty() && stack.peek() == popA[popIndex]) {
                stack.pop();
                popIndex++;
            }
        }
        return stack.isEmpty();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

东京女

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文