题目描述
给定 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 的一个排列
JavaScript实现
/**
* @param {number[]} pushed
* @param {number[]} popped
* @return {boolean}
*/
// 重点看出栈popped序列就可以
// 每次出栈的元素,要么是当前栈顶元素,要么是未来要入栈的元素
// 先看第一个出栈元素,要想出栈这个元素,那么一定要先入栈到这个元素
// 如示例1, 出栈元素4,那么一定要先入栈到4,然后才能出栈;[1,2,3,4];然后 栈顶4 出栈 => [1,2,3]
// 再看出栈元素5,看入栈序列栈顶是否是5,是就出栈,不是就先入栈再出栈, 先把元素5入栈=>[1,2,3,5]; 然后5出栈 =》[1,2,3]
var validateStackSequences = function(pushed, popped) {
let arr = []; // 定义一个新序列辅助操作。不影响pushed序列
// i 指向出栈序列的第i位, j 指向入栈序列的第j位
for(let i = 0, j = 0; i < popped.length; i ++){
// 如果arr的栈顶元素不等于要出栈的元素,就把原入栈序列的元素压入arr中
// 边界条件处理:压入arr的元素不能超出入栈序列范围,初始arr = [], 先要把原入栈序列的元素压入
while(j < pushed.length && (arr.length == 0 || arr[arr.length - 1] != popped[i])) {
arr.push(pushed[j]);
j ++;
}
// 如果找遍整个入栈序列都没有找到要出栈的元素,false
if(arr[arr.length -1] != popped[i]) return false;
// 如果找到了出栈元素,就直接pop
arr.pop()
}
return true
};