牛客网题解 | 栈的压入、弹出序列

栈的压入、弹出序列

一、题目链接

栈的压入、弹出序列

二、题目

三、算法原理:用一个栈模拟入栈出栈的过程

  • 思路:用一个栈模拟入栈出栈的过程,模拟出与第二个序列一样的序列就合法,模拟不出与第二个序列一样的序列就不合法。

给出两个下标pushi、popi分别指向入栈序列和出栈序列。(index:下标)

步骤:

  1. pushi指向的数据入栈,入栈后pushi++
  2. "持续比较"栈顶数据和popi指向的数据(因为有刚入栈的数据就出栈的可能,没有确定的出栈顺序,所以就要持续比较)。若相等,"持续"出数据,出一个数据popi就++;若不相等或者栈为空,执行步骤1。
  • 匹配案例演示,示例1:
  • 不匹配案例演示,示例2:

循环结束条件 是两个下标都越界吗?popi在合法的序列下是一定能走到最后的,但是popi在非法的序列下一定到不了最后,所以popi是否能走到最后面是不确定的。但是pushi一定能走到最后面,即循环结束条件。

如何判断入栈序列和出栈序列是否匹配?栈为空或者popi走到尾,两个条件选一个即可,因为两个条件会同时存在:栈为空,所有的数据都入栈了,栈为空一定是因为与出栈序列匹配,所有数据都出栈了,popi也走到了最后;popi走到尾,表示此时栈中数据都出栈了,栈一定为空。

"内存超限或者超时"的问题有两种可能性:代码有问题、死循环。入栈后要pushi++。

四、编写代码

在调用top前先判空,顺序不能颠倒,栈为空时直接取top元素会崩溃:

cpp 复制代码
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pushV int整型vector 
     * @param popV int整型vector 
     * @return bool布尔型
     */
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        // 用一个栈模拟入栈出栈的过程
        stack<int> st;
        // 持续比较栈顶元素和popi指向的元素:若相等,持续出栈,popi++;若不相等或栈为空,执行步骤1
        size_t pushi = 0, popi = 0;
        while (pushi < pushV.size())
        {
            st.push(pushV[pushi++]);
            while (!st.empty() && st.top() == popV[popi]) st.pop(), popi++;
        }
        return st.empty();
    }
};
相关推荐
初夏睡觉8 分钟前
从0开始c++,但是重置版,第1篇(c++基本框架)
开发语言·c++
前端小白在前进12 分钟前
⭐力扣刷题:螺旋矩阵
算法·leetcode·矩阵
老王熬夜敲代码13 分钟前
进程PCB
linux·笔记
HainesFreeman1 小时前
dns server是什么?自建的dns server是什么东西?有啥用?
笔记
xian_wwq4 小时前
【学习笔记】攻击链贯穿端边云!边缘网络访问三大核心风险预警
笔记·学习·安全·边缘计算
老赵聊算法、大模型备案5 小时前
北京市生成式人工智能服务已备案信息公告(2025年12月11日)
人工智能·算法·安全·aigc
workflower5 小时前
时序数据获取事件
开发语言·人工智能·python·深度学习·机器学习·结对编程
CoderYanger6 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
C++业余爱好者6 小时前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
厕所博士6 小时前
红黑树原理前置理解—— 2-3 树
算法·2-3树·红黑树原理理解前置