栈和队列相关的OJ题

news2024/10/2 14:33:09

1.栈的压入、弹出序列

题目链接

栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

题目描述

题目给出两个序列,一个是入序列pushV,一个是出序列popV,要求判断是否匹配入栈出栈的规则顺序。

解题思路

可以用数据模拟入栈出栈,将pushV序列的数据逐一放到栈中,当放到的数据与popV序列的数据相同时,则pop掉数据,再进行判断是否和栈顶相同,若是相同则进行pop,若是不同则将剩下数据再次逐一入栈,每次入栈一个数据都作一次判断是否需要出栈,最后将所有数据入栈后,此时对应判断pop数据后跳出循环,若是循环结束后栈内数据全部出栈成功,则意味着这两个序列匹配入栈出栈的规则,若还有数据则说明某次不匹配。

参考代码

    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) 
    {
        size_t pushi = 0,popi = 0;
        stack<int> st;
        while(pushi != pushV.size())
        {
            st.push(pushV[pushi++]);
            while(!st.empty() && st.top() == popV[popi])
            {
                st.pop();
                popi++;
            }
        }
        return st.empty();
    }

2.最小栈

题目链接

155. 最小栈 - 力扣(LeetCode)

题目描述

题目要求实现一个能够返回栈内数据最小值的栈,具备栈该有的基本接口,并且要以O(1)的代价提供一个接口,能够返回栈内最小的数据

解题思路

用C++的话可以复用库内的栈,将数据和最小值分别存在两个栈中,当栈push的时候,最小值的栈作判断,若是push的值比栈顶的小或者相等,则将值同时存放到放最小值的栈中,出栈时同样判断是否需要一起出栈,即可实现要求

参考代码

class MinStack 
{
public:
    MinStack() {}
    
    void push(int val) 
    {
        _st.push(val);
        if(_min.empty() || _min.top() >= val)
        {
            _min.push(val);
        }
    }
    
    void pop() 
    {
        if(_min.top() == _st.top())
        {
            _min.pop();
        }
        _st.pop();
    }
    int top() 
    {
        return _st.top();
    }
    
    int getMin() 
    {
        return _min.top();
    }
private:
    stack<int> _st;
    stack<int> _min;
};

3.逆波兰表达式求值

题目链接

150. 逆波兰表达式求值 - 力扣(LeetCode)

题目描述

逆波兰表达式也叫后缀表达式,计算机在对式子进行运算时,需要知道运算的先后顺序,因此需要将平时常见的中缀表达式先转换为后缀表达式,该题目要求模拟实现计算机然后实现对中缀表达式进行运算,题目给一串字符串序列,我们需要模拟实现计算过程,将计算结果返回

解题思路

后缀表达式的计算方法,从左往右遍历,遇到数值则入栈,当遇到运算符时,则将栈顶的两个元素作为表达式左值和右值进行运算(栈顶第一个元素为右值,第二个为左值),将结果继续入栈,重复操作后,最终遍历结束后,在栈中保留下来的值就是计算的最终结果。

参考代码

class Solution 
{
public:
    int evalRPN(vector<string>& tokens) 
    {
        stack<int> ret;
        int left = 0;
        int right =0;
        for(auto& e: tokens)
        {
            if(e == "+" || e =="-" || e =="*" || e == "/")
            {
                right = ret.top();
                ret.pop();
                left = ret.top();
                ret.pop();
                switch(e[0])
                {
                case '+':
                    ret.push(left+right);
                    break;
                case '-':
                    ret.push(left-right);
                    break;
                case '*':
                    ret.push(left*right);
                    break;
                case '/':
                    ret.push(left/right);
                    break;                    
                }
            }
            else
            {
                ret.push(stoi(e));
            }
        }
        return ret.top();
    }
};

4.用栈实现队列

题目链接

232. 用栈实现队列 - 力扣(LeetCode)

题目描述

用两个栈去实现一个队列,并且要支持其基本的接口

解题思路

两个栈可以想象成两个单口长杯,数据入队列时,用a栈去接收数据,当需要出队列时,则将a栈内的数据全部倒到b栈中,a栈负责接收数据,b栈负责出数据,当b为空则找a要数据,两个栈都为空则说明队列内为空

参考代码

class MyQueue 
{
public:
    MyQueue() {}
    
    void push(int x) 
    {
        _in.push(x);
    }
    
    void if_out_empty()
    {
        if(_out.empty() && !_in.empty())
        {
            while(!_in.empty())
            {
                _out.push(_in.top());
                _in.pop();
            }
        }

    }

    int pop() 
    {
        if_out_empty();
        int ret = peek();
        _out.pop();
        return ret;
    }
    
    int peek() 
    {
        if_out_empty();
        return _out.top();
    }
    
    bool empty() 
    {
        return _in.empty()&&_out.empty();
    }
private:
    stack<int> _in;
    stack<int> _out;
};

5.用队列实现栈

题目链接

225. 用队列实现栈 - 力扣(LeetCode)

题目描述

用两个队列实现栈的基本接口

解题思路

核心难点在于找到栈顶top,一个队列用来存放数据,一个队列用来找到栈顶,当需要pop栈顶的时候,可以让存放数据的队列,除了队尾的数据,也就是需要被pop的栈顶,其余全部放到另一个队列中,让另一个队列重新作为存储数据的地方,而栈顶单独拿出来释放即可。

参考代码

class MyStack {
public:
    MyStack() 
    {}
    
    void push(int x) 
    {
        if(_q1.empty())
        {
            _q2.push(x);
        }
        else
        {
            _q1.push(x);
        }
    }
    
    int pop() 
    {
        int ret = top();
        if(!_q1.empty())
        {
            while(_q1.size() != 1)
            {
                _q2.push(_q1.front());
                _q1.pop();
            }
            
            _q1.pop();
        }
        else
        {
            while(_q2.size() != 1)
            {
                _q1.push(_q2.front());
                _q2.pop();
            }
            _q2.pop();
        }
        return ret;
    }
    
    int top() 
    {
        if(!_q1.empty())
        {
            return _q1.back();
        }
        else
        {
            return _q2.back();
        }
    }
    
    bool empty() 
    {
        return _q1.empty() && _q2.empty();
    }
private:
    queue<int> _q1;
    queue<int> _q2;
    
};

总结

本章整理了部分与栈和队列相关的OJ题,加深练习栈和队列的特性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于樽海鞘群算法的无人机航迹规划-附代码

基于樽海鞘群算法的无人机航迹规划 文章目录 基于樽海鞘群算法的无人机航迹规划1.樽海鞘群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用樽海鞘群算法来优化无人机航迹规划。 …

一文讲清楚检索增强生成(RAG)

文章目录 什么是检索增强生成&#xff1f;逆向工作&#xff1a;为大语言模型提供额外的知识来回答问题通过系统提示给出LLM自定义指令为LLM提供特定的知识来源将所有内容放在一起并提出问题检索步骤&#xff1a;从您的知识库中获取正确的信息什么是嵌入&#xff1f;它们与知识检…

【第四天]C++高级类和对象:运算符重载、string类和智能指针的深度解析

一、运算符重载 运算符重载 是对已有的运算符 指定新功能&#xff0c;不能创建新运算符。 运算符重载关键字operator 语法&#xff1a;operator &#xff08;表示被重载的运算符&#xff09; 思路&#xff1a; 1、弄懂 函数的参数中参数个数取决于运算符是一元还是二元…

如何高效地给视频批量添加logo水印?

如果你想给大量的视频添加图片水印&#xff0c;那么固乔剪辑助手软件是一个非常不错的选择。通过这个软件&#xff0c;你可以轻松地批量添加图片水印&#xff0c;提高视频的质量和识别度。以下是如何使用固乔剪辑助手软件给视频批量添加图片水印的步骤&#xff1a; 步骤1&#…

Qt+树莓派4B 窗口半透明效果实现

文章目录 前言一、窗口半透明&#xff0c;窗口部件不透明1、构造函数中的设置2、paintEvent3、效果4、树莓派4B配置5、最终效果 前言 在树莓派4B下&#xff0c;使用Qt开发窗口半透明而窗口部件不透明效果时,发现窗口没能正常实现半透明效果,而是显示纯黑色背景。同样的代码在wi…

PLC 学习day03 PLC软件安装 PLC软件的介绍和对应的知识

1.资料来源 链接&#xff1a;7.PLC编程学习入门视频教程全集-三菱GX-Works2编程软件安装_哔哩哔哩_bilibili 链接&#xff1a;8.三菱plc视频教程全集之编程语言及软元件介绍_哔哩哔哩_bilibili 2. PLC软件的安装 三菱的PLC软件安装视屏的链接&#xff1a; 7.PLC编程学习入门视频…

Gymnasium的基本用法

目录 1.初始化环境 2.与环境交互 3.动作和观测空间 4.修改环境 Gymnasium是一个为所有单智能体强化学习环境提供API的项目&#xff0c;包括常见环境的实现:cartpole、pendulum、mountain-car、mujoco、atari等。 该API包含四个关键功能:make、reset、step和render&#xf…

对称加密操作

#常用密码技术 ##1 密码 1.1 发送者、接收者和窃听者 请想象一个Alice向Bob发送电子邮件的场景。在这个场景中&#xff0c;发出邮件的Alice称为 发送者&#xff08;sender&#xff09;&#xff0c;而收到邮件的Bob则称为 接收者&#xff08;receiver&#xff09;。 在讲解发送…

公司只有功能测试,如何进一步提升自己?

一定要帮助想上进却又迷茫的人。 最近也听到一些做功能测试的同学的交流&#xff0c;天天做手工测试&#xff0c;想提升一下自己又不知道如何提升&#xff1f;其实还是在于这些同学对自己没有一个清晰的定位&#xff0c;没有明确的目标。做为功能测试人员来讲&#xff0c;从发…

【OpenVINO】基于 OpenVINO Python API 部署 RT-DETR 模型

基于 OpenVINO Python API 部署 RT-DETR 模型 1. RT-DETR2. OpenVINO3. 环境配置3.1 模型下载环境3.2 模型部署环境 4. 模型下载与转换4.1 PaddlePaddle模型下载4.2 IR模型转换 5. Python代码实现5.1 模型推理流程实现 6. 预测结果展示7. 总结 RT-DETR是在DETR模型基础上进行改…

JS中面向对象的程序设计

面向对象&#xff08;Object-Oriented&#xff0c;OO&#xff09;的语言有一个标志&#xff0c;那就是它们都有类的概念&#xff0c;而通过类可以创建任意多个具有相同属性和方法的对象。但在ECMAScript 中没有类的概念&#xff0c;因此它的对象也与基于类的语言中的对象有所不…

异常数据检测 | Python基于奇异谱分析时间序列插补预测

文章概述 在时间序列分析中,「奇异谱分析」(「SSA」)是一种非参数谱估计方法。它结合了经典时间序列分析、多元统计、多元几何、动力系统和信号处理的元素。 “奇异谱分析”这个名称涉及协方差矩阵的奇异值分解中的特征值谱,而不是直接涉及频域分解。 SSA 可以帮助分解时…

基于多元宇宙算法的无人机航迹规划-附代码

基于多元宇宙算法的无人机航迹规划 文章目录 基于多元宇宙算法的无人机航迹规划1.多元宇宙搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用多元宇宙算法来优化无人机航迹规划。 …

宝诗单证使用手册,并使用抽象和反射做通用抽象类,节省开发成本

单证示例 1024最适合写blog了&#xff0c;别说了&#xff0c;别说了&#xff0c;建议变成法定节假日。 宝诗单证的官网&#xff1a;宝诗官网 (宝诗团队记得给我打广告费) 宝诗单证的使用步骤 使用 抽象类 将获取字段的步骤抽象出来&#xff0c;极大的省略了代码量。节省开发…

苏州德创机器视觉工程师工作怎么样?

每一家公司都有自身特点&#xff0c;同时也每一家都有自身的bug。 苏州德创作为美国康耐视Cognex产品在华东最大的代理商&#xff0c;也是康耐视外包团队。那么苏州德创有哪些业务构成&#xff0c;业务的构成也是其招聘的主要人员的方向。 设备视觉供应商&#xff0c;如卓越&…

【Linux进阶之路】进程(中)—— 进程地址空间

文章目录 一、 进程地址空间1.概念引入2.基本概念3.深入概念3.1 初识信息交互3.2 区域划分3.3 进程地址空间3.4 再识页表缺页中断进程挂起 总结 一、 进程地址空间 1.概念引入 指针指向的地址是内存中的地址吗&#xff1f;下面我们用一个实验来证明一下。 先来写程序看一下程…

2010-2021年北大中国商业银行数字化转型指数数据(第三期)

2010-2021年北大中国商业银行数字化转型指数数据&#xff08;第三期&#xff09; 1、时间&#xff1a;2010-2021年 2、指标&#xff1a;银行名称、银行类型、年份、战略数字化、业务数字化、管理数字化、数字化总指数 3、来源&#xff1a;北大数字金融研究中心 4、数据说明…

中文大语言和多模态模型测评

Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.A new tool that blends your everyday work apps into one. Its the all-in-one workspace for you and your teamhttps://yaofu.notion.site/C-Eval-6b79edd91b454e3d8ea41c59ea2af873排行榜…

Appium移动端自动测试框架,如何入门?

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 1、为什么要使用Appium&#xff1f; 2、如何搭建Appium工具环境?(超详细&#xff09; 3、通过demo演示Appium的使用 4、Appium如何…

【Unity程序技巧】异步保险箱管理器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…