地址 https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 示例 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 之前弹出。 提示: 0 <= pushed.length == popped.length <= 1000 0 <= pushed[i], popped[i] < 1000 pushed 是 popped 的排列。 注意:本题与主站 946 题相同:https://leetcode-cn.com/problems/validate-stack-sequences/
解答
我们使用一个stack数据结构来模拟即可。
由于栈的本身是先入后出而且只能弹出栈顶元素,题目也提到压入栈的元素都不相等。
那么弹出的执行只能在压入该元素且没有压入其他元素时候进行操作。
也就是该元素刚刚压入栈在栈顶的时候,且该元素也是pop序列的当前元素,我们将它弹出
既然没有分支没有其他选择,我们进行模拟该操作,查看最后能否弹出全部元素即可
图示
1
2
3
4
class Solution { public: stack<int> st; bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { int popidx = 0; for(int i = 0; i < pushed.size();i++ ){ while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){ st.pop();popidx++; } st.push(pushed[i]); } while(!st.empty()&& popidx < popped.size() &&st.top()== popped[popidx]){ st.pop();popidx++; } return st.empty(); } };