一、题目描述
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
示例 1:
输入: 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
复制代码
示例 2:
输入: pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出: false
解释: 1 不能在 2 之前弹出。
复制代码
提示:
1 <= pushed.length <= 10000 <= pushed[i] <= 1000pushed的所有元素 互不相同popped.length == pushed.lengthpopped是pushed的一个排列
本题要我们验证给出的入栈操作序列和出栈操作序列是否是可以匹配的相互操作
所以我们可以模拟整个操作过程,如果所有的入栈操作都可以完成,并且所有的出栈操作也都可以完成,并且栈为空,那就说明给出的入栈操作序列和出栈操作序列是匹配的
分析:
- 创建一个栈来进行后续操作
- 遍历入栈操作,将每一个元素入栈
- 每次入栈完成后判断栈顶元素是否等于出栈序列第一个元素,如果不等,继续入栈。如果相等,则删除出栈序列的第一个元素,并将栈顶元素弹出,直到栈顶元素不等于出栈序列第一个元素
- 重复以上过程,直到所有入栈操作完成
- 此时如果栈为空,且出栈序列为空,则说明所有出栈操作都可以完成,且是在最初空栈上进行的,返回
true。
否则说明不是,返回 false
整体过程如下:
二、代码实现
var validateStackSequences = function(pushed, popped) {
// 创建空栈
const stack = [];
// 遍历入栈操作序列
for(let i = 0;i<pushed.length;i++){
// 将每一个元素入栈
stack.push(pushed[i])
// 当栈不为空且栈顶元素等于出栈操作序列的第一个元素时
while(stack.length && stack[stack.length-1]===popped[0]){
// 栈顶元素弹出
stack.pop();
// 出栈操作序列第一个元素删除
popped.shift();
}
}
// 如果栈为空且出栈序列为空,则说明两个操作序列是在空栈基础上匹配的操作序列
return stack.length===0 && popped.length===0
};
以上就完成了这道题的实现: 欢迎讨论评论区留言哈