# 题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
提示:
0 <= pushed.length == popped.length <= 10000 <= pushed[i], popped[i] < 1000pushed是popped的排列。
# 测试用例
用例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 之前弹出。
 
# 思路
- 先把
pushed序列压入栈stack,压入一个元素之后与popped第一个元素比较,如果相同,就弹出stack栈顶元素,同时删除popped第一个元素,继续比较,直到两者不同 - 重复1的操作,直到遍历结束
 - 如果
stack为空,则为true,否则为false 
# 代码实现
var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;
console.log("请输入pushed序列");
const pushed = readline().split(",").map(Number);
console.log("请输入popped序列");
const popped = readline().split(",").map(Number);
var validateStackSequences = function (pushed, popped) {
  // 辅助栈来模拟序列的压入
  // 每次与弹出顺序的第一个元素进行比较
  let 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;
};
const res = validateStackSequences(pushed, popped);
console.log("结果为: ", res);
/* 
  请输入pushed序列
  1,2,3,4,5
  请输入popped序列
  4,5,3,2,1
  结果为:  true *
  请输入pushed序列
  1,2,3,4,5
  请输入popped序列
  4,3,5,1,2
  结果为:  false
*/
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50