当前位置: 首页 > 图灵资讯 > 技术篇> 栈的压入弹出序列java

栈的压入弹出序列java

来源:图灵教育
时间:2023-12-11 16:50:02

介绍堆栈的压入弹出序列

在学习编程的过程中,我们经常会遇到栈的数据结构。栈是一种“先进后出”的数据结构,类似于我们日常生活中的一个现象,就是一堆盘子,只能从顶部取出或放入盘子中。

在编程中,堆栈的压入弹出序列是一个常见的问题。给出堆栈的压入序列和弹出序列,我们需要判断弹出序列是否合法。

本文将告诉您如何实现堆栈压入弹出序列的算法,并提供相应的示例代码。

算法流程

以下是堆栈压入弹出序列的算法过程。我们将使用辅助堆栈来模拟实际的堆栈操作。

graph TDA[初始化栈和辅助栈] --> B[遍历压入序列]B --> C{辅助栈空或栈顶元素不等于当前弹出元素}C -->|是| D[将当前元素压入辅助栈]D --> E[更新弹出序列索引]C -->|否| F[将栈顶元素弹出辅助栈]F --> G[更新弹出序列索引]B --> H[返回是否合法]
代码实现

以下是实现堆栈压入弹出序列的示例代码:

import java.util.Stack;public class StackSequence {    public boolean isPopOrder(int[] pushSequence, int[] popSequence) {        // 初始化栈和辅助栈        Stack<Integer> stack = new Stack<>();        int pushIndex = 0;        int popIndex = 0;        // 压入序列遍历        while (pushIndex < pushSequence.length) {            // 辅助栈为空或栈顶元素不等于当前弹出元素            if (stack.isEmpty() || stack.peek() != popSequence[popIndex]) {                // 将当前元素压入辅助栈                stack.push(pushSequence[pushIndex]);                // 弹出序列索引更新                pushIndex++;            } else {                // 将栈顶元素弹出辅助栈顶元素                stack.pop();                // 弹出序列索引更新                popIndex++;            }        }        // 返回是否合法        while (!stack.isEmpty() && popIndex < popSequence.length) {            if (stack.pop() != popSequence[popIndex]) {                return false;            }            popIndex++;        }        return true;    }}

代码解释:

  • 首先,我们需要初始化一个栈和一个辅助栈和两个索引变量pushIndexpopIndex,分别用于遍历压入序列和弹出序列。
  • 然后,我们使用一个循环来通过历压入序列来判断辅助栈是空的还是栈顶元素是否等于当前弹出元素。如果是,将当前元素压入辅助栈并更新弹出序列的索引;如果没有,将栈顶元素弹出辅助栈并更新弹出序列的索引。
  • 然后,我们使用另一个循环来判断辅助栈中的剩余元素是否等于弹出序列中的剩余元素。
  • 最后,返回判断结果。
测试用例

以下是验证我们算法是否正确的测试用例。

压入序列弹出序列合法性[1,2,3,4,5][4,5,3,2true[1,2,3,4,5][4,3,5,1false[1,2,3,4,5][5,4,3,2true[1,2,3,4,5][4,5,2,3true[1,2,3,4,5]