题目描述
给定 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 的一个排列
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解思路
- 定义一个空序列resStack,按照pushed数组的顺序依此向空序列里推入pushed的数据。
- 每推入一次就去popped中找第一个元素检查,如果popped第一个元素等于resStack的栈顶元素,那么就对。resStack序列做pop操作,此时将popped中已经被resStack序列pop过的首元素移除,使用shift。
- 直到第二步popped数组的首元素不等于resStack中的栈顶元素,pushed向下循环一位。
- 当pushed循环完成后,如果resStack中为空说明给定的pushed和popped是可以按照一定的顺序完成从一个空序列走完全部的pushed和popped的操作。
题解代码
* @lc app=leetcode.cn id=946 lang=javascript
*
* [946] 验证栈序列
*/
// @lc code=start
/**
* @param {number[]} pushed
* @param {number[]} popped
* @return {boolean}
*/
var validateStackSequences = function(pushed, popped) {
let resStack = [];//定义空栈
for (let i = 0; i < pushed.length; i++) {
resStack.push(pushed[i]);//按照pushed的顺序向resStack中添加
//然后去popped中找首元素,如果首元素等于resStack栈顶元素,就将resStack做pop操作
//直到不能pop,继续循环,推入下一元素
while (popped[0] !== undefined && popped[0] === resStack[resStack.length - 1]) {
resStack.pop();
popped.shift();
}
}
return !resStack.length;
};
// @lc code=end