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

思路

所有的元素一定是按顺序 push 进去的,重要的是怎么 pop 出来?

假设当前栈顶元素值为 2,同时对应的 popped 序列中下一个要 pop 的值也为 2,那就必须立刻把这个值 pop 出来。因为之后的 push 都会让栈顶元素变成不同于 2 的其他值,这样再 pop 出来的数 popped 序列就不对应了。

算法

将 pushed 队列中的每个数都 push 到栈中,同时检查这个数是不是 popped 序列中下一个要 pop 的值,如果是就把它 pop 出来。

最后,检查不是所有的该 pop 出来的值都是 pop 出来了。

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> stk;
        int j = 0;
        for (int i = 0; i < pushed.size(); i++) {
            int x = pushed[i];
            stk.push(x);
            
            while(j < popped.size() && stk.size() && stk.top() == popped[j]) {
                stk.pop();
                j++;
            }
        }
        return j == popped.size();
    }
};
原文地址:https://www.cnblogs.com/fxh0707/p/15049170.html