题目链接

牛客网

题目描述

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

示例1

  1. 输入:
  2. [1,2,3,4,5],[4,3,5,1,2]
  3. 输出:
  4. false

解题思路

模拟法

使用一个栈来模拟压入弹出操作。

  1. 初始化:用指针i指向pushV的第一个位置, 指针j指向popV的第一个位置
  2. 如果pushV[i] != popV[j], 那么应该将pushV[i]放入栈中, ++i(找到当前最早出栈的元素)
  3. 否则,pushV[i]==popV[j], 说明这个元素是放入栈中立马弹出,所以,++i, ++j,然后应该检查popV[j]
    与栈顶元素是否相等,如果相等,++j, 并且弹出栈顶元素(将跟随的元素出栈,如果不出栈则被压在入栈元素后面)
  4. 重复2,3, 如果i==pushV.size(), 说明入栈序列访问完,此时检查栈是否为空,如果为空,说明匹配,否则不匹配。
    如下图:

31. 栈的压入、弹出序列 - 图1

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        stack<int> st;
        int i=0,j=0;
        while(i<pushV.size()){
            if(pushV[i]!=popV[j]){
                st.push(pushV[i]);
                ++i;
            }
            else{
                ++i;
                ++j;
                while(!st.empty()&&st.top()==popV[j]){
                    st.pop();
                    j++;
                }
            }
        }
        return st.empty();
    }
};
import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        Deque<Integer> stack = new LinkedList<Integer>();
        int j = 0;
        for(int i = 0; i < pushA.length; ++i){
            stack.push(pushA[i]);
            while(j < popA.length && !stack.isEmpty() && stack.peek() == popA[j]){
                stack.pop();
                ++j;
            }
        }
        return stack.isEmpty();
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n), 用了一个辅助栈,最坏情况下会全部入栈