当前位置: 首页 > article >正文

JZ31 栈的压入、弹出序列

题目来源:栈的压入、弹出序列_牛客题霸_牛客网

题目:如下

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

答案:如下

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pushV int整型vector 
     * @param popV int整型vector 
     * @return bool布尔型
     */
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        // write code here
        stack<int> st;
        int pushi=0,popi=0;
        while(pushi<pushV.size())
        {
            st.push(pushV[pushi]);
            ++pushi;

            while(!st.empty()&&st.top()==popV[popi])
            {
                st.pop();
                ++popi;
            }
        }

        return st.empty();
    }
};

解析:如下

(1)建立栈和变量

题目是判断第二个序列是否可能为该栈的弹出顺序,那么这里我们可以建立一个栈来模拟栈的压入和弹出

由于pushV和popV是vector可以用operator[]来进行访问,那么我们可以创建变量pushi和popi用于访问pushV和popV

stack<int> st;
int pushi=0,popi=0;

(2)模拟

假设pushV中有5个数据,那么当pushi=4的时候已经访问完pushV中的数据,那么我们就可以以此为while循环判断条件,即pushi<pushV.size()

将pushV中的数据逐个压入st栈中,由于出栈的顺序未定,判断是否符合popV序列,那么可能入完第一个判断不符合,再入第二个判断符合,,当st不为空时,并且当st的栈顶数据等于popV的数据时就把st的栈顶数据pop掉,有可能弹出完,下一个数据仍可能在弹出数据中,这时我们继续进行判断

如图所示


while(pushi<pushV.size())
{
        st.push(pushV[pushi]);
        ++pushi;

        while(!st.empty()&&st.top()==popV[popi])
        {
            st.pop();
            ++popi;
        }
}

(3)判断

当数据都弹出后,st为空,说明pushV中的数据对应有符合popV中的出栈顺序,反之则没有

return st.empty();

到这里我们讲解完毕

如果对您有帮助的话点一个免费的赞和收藏叭!

由于作者水平不足,如有任何错误,请读者在评论区交流!


http://www.kler.cn/a/453984.html

相关文章:

  • vue2 升级为 vite 打包
  • 嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备
  • 【HarmonyOS】鸿蒙将资源文件夹Resource-RawFile下的文件存放到沙箱目录下
  • Java开发经验——数据库开发经验
  • 路由器做WPAD、VPN、透明代理中之间一个
  • Java预加载
  • Windows脚本命令与Linux Bash脚本命令
  • xctf-WEB-新手练习区Exercise area-Writeup
  • 2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
  • BP回归-反向传播(Backpropagation)
  • 【git】配置ssh代理
  • 人工智能与大数据:商贸物流变革的双引擎与挑战应对
  • 软件设计与体系结构
  • 消费企业如何提升主动造血能力?会员精细化运营是关键!
  • 面试知识点汇总_05
  • linux提示结构需要清理
  • nodejs操作达梦数据库的封装
  • 基于YOLOV5+Flask安全帽RTSP视频流实时目标检测
  • 移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM
  • 【开源免费】基于SpringBoot+Vue.JS植物健康系统(JAVA毕业设计)
  • 1847. 最近的房间
  • 【OCR】数据集合集!
  • 操作002:HelloWorld
  • 使用EasyExcel来动态生成表头
  • 安全筑堤,效率破浪 | 统一运维管理平台下的免密登录应用解析
  • 【Go】-限流器的四种实现方法