网络异常,图片无法展示
|
给定 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 <= 1000
0 <= pushed[i] <= 1000
pushed
的所有元素 互不相同popped.length == pushed.length
popped
是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 }; 复制代码
至此我们就完成了 leetcode-946-验证栈序列
如有任何问题或建议,欢迎留言讨论!