剑指Offer 31 - 栈的压入、弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
思路
使用一个辅助栈s模拟入栈出栈操作,如果最终可以使s重新为空则弹出序列正确。
要点:
什么时候可以弹出:弹出序列对应数字和辅助栈栈顶一样
步骤:
压栈序列 pushed 索引 i,弹出序列 popped 索引 j:
- 压入pushed[i],i后移
- 若popped[j]与s栈顶相同,s执行一次弹出,j后移。重复此步骤直到popped[j]与栈顶不同。
- 重复1,2直到i遍历完整个压栈序列
- 若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条件)

浙公网安备 33010602011771号