题目
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
示例
输入: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
解题思路
因为栈的特性是先进后出,所以定义一个用来暂存的栈temp,和指向poped数组的指针p,用来接收pushed的值,每次push进来的值都进行循环判断,是否与poped[p]是否相等,满足条件p向后移一位,表示之前的值被匹配上,同时将temp最后一位出栈,最后返回temp长度,如果为空,表示是正常的栈序列
/**
* @param {number[]} pushed
* @param {number[]} popped
* @return {boolean}
*/
var validateStackSequences = function(pushed, popped) {
// 定义暂存栈和指针
let temp = [], p = 0;
// 将pushed数组的值依次放入temp中
pushed.forEach(item => {
temp.push(item);
// 判断temp栈顶元素是否与poped[p]值相等,相等表示可以出栈
while(temp.length && temp[temp.length - 1] === popped[p]) {
temp.pop();
p++;
}
})
// 最后如果temp中有值,表示不能完全出栈,没值才是标准的栈
return temp.length === 0;
};