栈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:栈的压入和弹出序列的问题的主要内容,如果未能解决你的问题,请参考以下文章