剑指offer_栈的压入、弹出序列

113 阅读1分钟

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。

假设压入栈的所有数字均不相等。

例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。

注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。

思路:

  1. 模拟题!一个辅助栈,进行匹配
  2. 如果入栈的数和 出栈的一致,则表示,现在要弹出
  3. 如果不一致,继续压入
  4. 记得更新i
/**
 * @param {number[]} pushV
 * @param {number[]} popV
 * @return {boolean}
 */
var isPopOrder = function(pushV, popV)
{
    if (pushV.length !== popV.length) return false
    const stk = []
    function pop() {
        return stk[stk.length - 1]
    }
    let i = 0
    for (const num of pushV) {
        stk.push(num)
        while(stk.length && pop() === popV[i]){
            stk.pop()
            i++
        }
    }
    return stk.length === 0
}