栈2:栈的压入和弹出序列的问题

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈2:栈的压入和弹出序列的问题相关的知识,希望对你有一定的参考价值。

这个题在LeetCode中没找到,但是在剑指offer和其他材料里经常出现,也是考验栈基本功的最经典题,我们就来看一下。

先看题目要求:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

示例:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4), pop() -> 4,push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

给定一个压入序列 pushed和弹出序列 popped,则压入/弹出操作的顺序(即排列)是唯一确定的,如下图。

栈的数据操作具有 先入后出 的特性,因此某些弹出序列是无法实现的。

所以,我们的基本思路是借用一个辅助栈,模拟入栈和出栈过程,根据是否模拟成功来判断。

具体的步骤是:

1.初始化:辅助栈 stack ,弹出序列的索引 i;

2.遍历压栈序列:各元素记为 num;

   (1)元素 num入栈;

     (2)循环出栈:若 stack的栈顶元素 == 弹出序列元素 popped[i],则执行出栈与 i++ ;

3.返回值:若 stack 为空,则此弹出序列合法。

class Solution {    public boolean validateStackSequences(int[] pushed, int[] popped) {        Stack<Integer> stack = new Stack<>();        int i = 0;        for(int num : pushed) {             // num 入栈            stack.push(num);             // 循环判断与出栈            while(!stack.isEmpty() && stack.peek() == popped[i]) {                 stack.pop();                i++;            }        }        return stack.isEmpty();    }}

以上是关于栈2:栈的压入和弹出序列的问题的主要内容,如果未能解决你的问题,请参考以下文章

栈的压入和弹出序列(剑指Offer)

数据结构和算法之栈和队列二:栈的压入,弹出序列

深入理解计算机系统学习( 栈的压入和弹出)

栈的压入,弹出序列

剑指offer 栈的压入弹出序列

c++刷题——剑指offer21.栈的压入弹出序列