题解 | #栈的压入、弹出序列#

栈的压入、弹出序列

https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106

class Solution {
public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        stack<int> s;  // 创建一个栈s,用于模拟入栈和出栈操作
        int j = 0;     // 定义一个指针j,表示popV数组中的索引
        
        for(int i = 0; i < pushV.size(); i++) {
            s.push(pushV[i]);  // 将pushV[i]入栈

            // 当栈不为空且栈顶元素等于popV[j]时,说明栈顶元素可以出栈
            while(!s.empty() && s.top() == popV[j]) {
                j++;           // 指针j右移,指向popV数组的下一个元素
                s.pop();       // 将栈顶元素出栈
            }
        }
        
        return s.empty();  // 如果栈为空,说明pushV数组的入栈顺序和popV数组的弹出顺序是合法的,返回true;否则返回false
    }
};

解题思路

解题思路如下:

我们可以使用一个辅助栈来模拟入栈和出栈的操作。具体的解题思路如下:

  1. 首先,我们创建一个空栈s用于模拟入栈和出栈操作,创建一个指针j,初始值为0,表示出栈顺序的索引。
  2. 对于入栈顺序pushV中的每个元素pushV[i],将其依次入栈到栈s中。
  3. 在入栈操作后,我们需要进行以下判断:对于栈s的栈顶元素s.top(),如果s.top()等于出栈顺序popV[j],则说明栈顶元素可以出栈。我们将指针j右移,指向出栈顺序的下一个元素,表示已经找到了一个合法的出栈元素。
  4. 重复进行上述判断和操作,直到栈s为空或者栈顶元素不等于出栈顺序popV[j]。
  5. 最后,我们判断栈s是否为空。如果栈s为空,说明入栈顺序和出栈顺序是合法的,返回true;否则返回false。

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务