C++《stack和queue的一些OJ题目》

news2024/11/25 23:24:47

本文主要讲解C++中stack和queue的一些OJ题目

文章目录

  • 1、[最小栈](https://leetcode.cn/problems/min-stack/)
  • 2、[栈的压入、弹出序列](https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&&tqId=11174&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking)
  • 3、[逆波兰表达式](https://leetcode.cn/problems/evaluate-reverse-polish-notation/)
  • 4、[用栈实现队列](https://leetcode.cn/problems/implement-stack-using-queues/submissions/)



1、最小栈

在这里插入图片描述
思路1

使用两个栈,st用来进行常规的入栈操作。minst栈也同步进行,但是有要求,该栈主要负责返回最小值。当minst为空或者val比minst栈顶元素小才入栈。当minst的栈顶元素和st的栈顶栈
在这里插入图片描述
在这里插入图片描述

代码如下:

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) 
    {
        if(minst.empty() || minst.top() >= val)
        {
            minst.push(val);
        }
        st.push(val);
    }
    
    void pop() 
    {
        if(st.top() == minst.top())
        {
            minst.pop();
        }
        st.pop();
    }
    
    int top() 
    {
        return st.top();
    }
    
    int getMin() 
    {
        return minst.top();
    }
private:
     stack<int> st;
     stack<int> minst;

};

但是,当全部元素相同时,我们的空间复杂度是O(N)了。这时,我们可以将最小栈设计成结构体,结构体里面存储的是元素的值和个数。

思路2

为了解决元素相同时,消耗内存。和方法思路一样,只是此时入栈的是一个结构体数据。{1,12},1表示数据,12表示出现的次数

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) 
    {
        if(_minst.empty())
        {
            Data d;
            d._val = val;
            d._count++;
            _minst.push(d);
        }
        else if(_minst.top()._val == val)
        {
            _minst.top()._count++;
        }
        else if(_minst.top()._val >= val)
        {
            Data d;
            d._val = val;
            d._count++;
            _minst.push(d);
        }
        
        _st.push(val);
    }
    
    void pop() 
    {
        if((_minst.top()._val == _st.top()) && _minst.top()._count > 1)
        {
            _minst.top()._count--;
        }
        else if((_minst.top()._val == _st.top()) && _minst.top()._count == 1)
        {
            _minst.pop();
        }
        _st.pop();
    }
    
    int top() 
    {
        return _st.top();
    }
    
    int getMin() 
    {
        return _minst.top()._val;
    }
private:
    stack<int> _st;

    //定义一个结构体,当入栈时候,入的是一个结构体[{1,12}],表示1有12个
    struct Data
    {
        int _val = 0;
        int _count = 0;
    };
    stack<Data> _minst;
};

2、栈的压入、弹出序列

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码如下:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV)
    {
        stack<int> st;
        int pushi = 0,popi = 0;
 
        //遍历pushV进行入栈操作
        while(pushi < pushV.size())
        {
            //入栈
            st.push(pushV[pushi++]);
 
            //和比较popV[]比较进行出栈操作
            while(!st.empty() && st.top() == popV[popi])
            {
                st.pop();
                popi++;
            }
        }
        return st.empty();
    }
};

3、逆波兰表达式

在这里插入图片描述

注意:逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )

逆波兰表达式主要有以下两个优点:

1.去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
2.适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

在这里插入图片描述

class Solution {
public:
    int evalRPN(vector<string>& tokens) 
    {
        stack<int> st;
        for(auto& str : tokens)
        {
            if(!(str == "+" || str == "-" || str == "*" || str == "/"))
            {
                st.push(stoi(str)); //操作数转化为整形入栈
            }
            else
            {
                //操作符取栈顶的两的元素出栈进行运算,先是右操作数,再是左操作数
                int right = st.top();
                st.pop();

                int left = st.top();
                st.pop();

                int ret;
                switch(str[0])
                {
                    case '+':
                        st.push(left + right);
                        break;
                     case '-':
                        st.push(left - right);
                        break;
                    case '*':
                        st.push(left * right);
                        break;
                    case '/':
                        st.push(left / right);
                        break;   
                }
            }
        }
        return st.top();
    }
};

4、用栈实现队列

在这里插入图片描述
思路:定义两个栈,q1和q2。其中q1用于存储栈的元素,q2用于辅助操作。

具体实现方法是:在每次压入元素时,将元素先插入到q2的队尾,然后将q1中的所有元素依次弹出并插入到q2中,最后将q1和q2交换。这样,每次操作后,q1中的队头元素就是最后一个压入的元素,也就是栈顶元素。在弹出元素时,直接从q1中弹出队头元素即可。在获取栈顶元素时,直接返回q1中的队头元素即可。在判断栈是否为空时,只需要检查q1是否为空即可。
在这里插入图片描述

class MyStack {
public:
    queue<int> q1 ,q2;
    MyStack() {}
    
    void push(int x) {
        q2.push(x);
        while(!q1.empty())
        {
            q2.push(q1.front());
            q1.pop();
        }
        swap(q1,q2);
    }
    
    int pop() {
        int front=q1.front();
        q1.pop();
        return front;
    }
    
    int top() {
        int front=q1.front();
        return front;
    }
    
    bool empty() 
    { return q1.empty();}
};

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

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

相关文章

路径规划算法:基于乌鸦优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于乌鸦优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于乌鸦优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法乌鸦…

驱动开发:内核解析PE结构节表

在笔者上一篇文章《驱动开发&#xff1a;内核解析PE结构导出表》介绍了如何解析内存导出表结构&#xff0c;本章将继续延申实现解析PE结构的PE头&#xff0c;PE节表等数据&#xff0c;总体而言内核中解析PE结构与应用层没什么不同&#xff0c;在上一篇文章中LyShark封装实现了K…

ChatGPT国内免费使用方法【国内免费使用地址】

当下人工智能技术的快速发展&#xff0c;聊天机器人成为了越来越多人们日常生活和工作中的必备工具。如何在国内免费使用ChatGPT聊天机器人&#xff0c;成为了热门话题。本文将为你详细介绍ChatGPT国内免费使用方法&#xff0c;让你轻松拥有聊天机器人助手&#xff0c;提高工作…

基于Halcon卡尺测量: Metrology批量测量矩形和圆

处理图如下: 原图如下: 主要思想: 1.准备一次性将图中12个圆和2个矩形都检测出来 2.初步确定12个圆的圆心坐标和半径,初步确定两个矩形的中心坐标,角度,长短边长 3.创建计量模型 4.定义计量模型尺寸 5.增加检测矩形和圆形的信息参数 6.应用计量模型,获取结果 7.显示…

什么是 IMU?惯性测量单元工作和应用

术语IMU代表“惯性测量单元”&#xff0c;我们用它来描述测量工具的集合。当安装在设备中时&#xff0c;这些工具可以捕获有关设备移动的数据。IMU 包含加速度计、陀螺仪和磁力计等传感器。 IMU 如何工作&#xff1f; IMU 可以测量各种因素&#xff0c;包括速度、方向、加速度、…

vue 单点登录的方法

vue 单点登录的方法 当我们在使用 vue开发项目时&#xff0c;一般都是只有一个用户帐号&#xff0c;如果要实现多个帐号的单点登录&#xff0c;可以使用 Session和 LocalStorage这两个技术。这两个技术在实现单点登录时&#xff0c;都需要有一个用户名和一个密码&#xff0c;而…

【C++】C++ 11 智能指针

【C】C 11 智能指针 文章目录 【C】C 11 智能指针1.为什么需要智能指针2. C中智能指针和指针的区别是什么&#xff1f;3. C中的智能指针有哪些&#xff1f;分别解决的问题以及区别&#xff1f;&#xff08;1&#xff09;auto_ptr&#xff08;C98的方案&#xff0c;C11已经弃用&…

JavaEE进阶(Mybatis)5/31

目录 1. SQL注入 2.concat&#xff08;&#xff09;用于like模糊查询 3.resultMap 4. 5.动态SQL 6.foreach标签 1. SQL注入 $问题会导致SQL注入 因为$是直接替换的&#xff0c;and的优先级高于or true or false #不存在SQL注入的问题&#xff0c;因为他是预编译的&…

坚持的工作好习惯

工作好习惯 目录概述需求&#xff1a; 设计思路实现思路分析1.工作好习惯的重要性2.谈下自己的工作方法2.希望有时也从别人那里也学习一下看看 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;s…

windows xp 上 Task Scheduler服务 启动后停止,导致数据库自动备份无法编辑和使用问题解决

项目中使用了mysql数据库&#xff0c;大多数人都会选择Navicat来连接数据库&#xff0c;一般会设置计划来自动备份数据库&#xff0c;但我在编辑自动备份的计划时&#xff0c;弹出task scheduler服务无法启动&#xff0c;退出回到桌面&#xff0c;启动windows的服务&#xff0c…

牛客网C++面试宝典(一)C/C++基础之语言基础

此系列为在学习牛客网C面试宝典过程中记录的笔记&#xff0c;本篇记录第一章C/C基础部分的第一节&#xff1a;语言基础。 牛客网C面试宝典链接&#xff1a;https://www.nowcoder.com/issue/tutorial?tutorialId93&uuida34ed23d58b84da3a707c70371f59c21 文章目录 1.1 简述…

Docker 数据持久化方案详解

目录 一、Docker数据持久化概述 1.1联合文件系统 1.2容器的数据卷 1.2.1 什么是数据卷 1.2.2 数据卷特点 1.2.3 Docker提供三种方式将数据从宿主机挂载到容器 二、 Docker持久化方案 2.1 查看volume 基本命令使用方法 2.2 volume持久化方案 2.2.1volume简介 2.2.2.v…

【JavaSE】Java基础语法(四十一):TCP通信程序

文章目录 1. TCP发送数据2. TCP接收数据【应用】3. TCP程序练习4. TCP程序文件上传练习【应用】 1. TCP发送数据 Java中的TCP通信 Java对基于TCP协议的的网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。…

Android 易忽略小知识

1.设置hint的字体大小 在Android xml文件中并没有直接设置hint字体大小的属性。如果hint文字的大小不希望跟正常字体的大小一样&#xff0c;就只能通过代码的方式来进行处理。 提供两种方式&#xff1a; //设置"用户名"提示文字的大小 EditText etUserName (Ed…

教育硬件“老玩家”进入智能手机新赛道,小度胜算几何?

从5月8日有传言称“百度旗下小度将进军智能手机市场”&#xff0c;到5月17日小度官宣将推出旗下新物种产品——小度青禾学习手机&#xff0c;小度在短短10天时间成为市场关注的焦点。 而5月22日&#xff0c;其也拿出了真正的成果&#xff0c;这部专门为青少年打造的学习手机正…

MySQL——在Linux环境下安装(在线安装)

MySQL的安装&#xff08;在线安装&#xff09; mysql的安装并不是比赛的内容&#xff0c;所以我们用比较方便的在线安装的方法&#xff0c;比起安装&#xff0c;我们更要知道如何去使用&#xff1a; 首先看一下自己有没有安装MySQL的服务&#xff0c;或者自己的服务器上有没有…

application.yml中的配置怎么写

1.问题 application.yml中可以做很多组件的配置,比如redis,mongo, 但是这些的key是什么,value怎么写呢? 2.分析问题 为了搞清楚这个问题,我们需要先了解application.yml中的配置是怎么加载的,以MongoProperties配置加载为例, 在Spring Boot中,可以使用application.y…

【OJ比赛日历】快周末了,不来一场比赛吗? #06.03-06.09 #18场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-06-03&#xff08;周六&#xff09; #7场比赛2023-06-04…

【数据结构】---二叉树类型部分练习解析让你更深程度了解二叉树

文章目录 前言&#x1f31f;一、第一种&#xff1a;二叉树性质类型&#xff1a;&#x1f30f;1.1 第一题&#xff1a;&#x1f4ab;1.1.1 理论&#xff1a;&#x1f4ab;1.1.2 图解&#xff1a;&#x1f4ab;1.1.3 解析&#xff1a; &#x1f30f;1.2 第二题&#xff1a;&#…

小明给大家分享几个CSDN涨粉小技巧,期待大家多多涨粉

今天和大家一起来聊聊CSDN涨粉相关几个的技巧&#xff0c;希望对热爱技术分享&#xff0c;并且想快速涨粉提升自身曝光度的朋友们提供一些经验&#xff0c;本文都是自己的一些想法&#xff0c;有说的不对的地方希望大家指正&#xff01; 一、个人介绍 我叫小明&#xff0c;我的…