剑指Offer 31 - 栈的压入、弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

思路

使用一个辅助栈s模拟入栈出栈操作,如果最终可以使s重新为空则弹出序列正确。

要点:

   什么时候可以弹出:弹出序列对应数字和辅助栈栈顶一样

步骤:

  压栈序列 pushed 索引 i,弹出序列 popped 索引 j:

  1. 压入pushed[i],i后移
  2. 若popped[j]与s栈顶相同,s执行一次弹出,j后移。重复此步骤直到popped[j]与栈顶不同。
  3. 重复1,2直到i遍历完整个压栈序列
  4. 若s为空,则弹出序列正确,否则不存在这样的弹出序列。

 代码:

var validateStackSequences = function(pushed, popped) {
   
    const pushedLen = pushed.length;
    const poppedLen = popped.length;
    let i = 0, j = 0;
    let s = [];
    
    for(i = 0; i < pushedLen; i++){
        s.push(pushed[i]);
        let top = s[s.length-1];
        while(j < poppedLen && top === popped[j]){
            s.pop();
            top = s[s.length-1];
            j++;
        }
    }
    
    return s.length === 0;
};

 

易错:

  数组越界(漏掉j < poppedLen条件)

posted @ 2020-06-22 10:05  studystudyxinxin  阅读(160)  评论(0)    收藏  举报