C++初阶 | [十] stack 和 queue

摘要:stack OJ:最小栈、栈的弹出压入序列;queue OJ:二叉树的层序遍历(仅思路,带图解)、逆波兰表达式求值;deque,模拟实现 stack 和 queue

经过对 string、vector、list 的学习,stack 和 queue 上手起来就很快了,因此不再赘述,在使用上有疑问请查看文档。本文将会通过一些OJ题来进一步熟练 stack 和 queue.


1. stack/queue 与 vector/list

  • stack/queue——容器适配器(不自己管理数据)

  • vector/list——容器(自己直接管理数据)

  •  stack/queuevector/list 的成员函数的区别
    stack/queue 没有 iterator,因为 stack 是先进后出,queue 是先进先出,不能随机遍历。

2. stack OJ

1)最小栈

155. 最小栈 - 力扣(LeetCode)

思路

我们很容易可以想到用一个变量来存储栈中最小的数据,然而,当pop掉的数据正好是最小数时,那么这个pop操作之后的栈中的最小数就不得而知了,因此,我们不仅要记录栈中数据的当前最小数,而是要记录历史最小数。这里,我们通过使用双栈来实现这个思路。

上述思路图解示例:

代码示例

class MinStack {
public:void push(int val) {st.push(val);if(min_st.empty() || val <= min_st.top())min_st.push(val);}void pop() {if(st.top() == min_st.top()){st.pop();min_st.pop();}    elsest.pop();}int top() {return st.top();}int getMin() {return min_st.top();}
private:stack<int> st;stack<int> min_st;
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

2)栈的压入、弹出序列

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

思路

按给定的入栈顺序模拟数据入栈,同时按给定的出栈顺序模拟数据出栈,最终栈中数据全部出完即为该出栈顺序合法。

注意:如下图,如果先判断再入栈这个过程会比较复杂,这里建议先入栈再判断

代码示例

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param pushV int整型vector* @param popV int整型vector* @return bool布尔型*/bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// write code herestack<int> st;size_t size = pushV.size();for (size_t pushi = 0, popi = 0; pushi < size; ++pushi){st.push(pushV[pushi]);while (!st.empty() && st.top() == popV[popi])//要先判断是否为空才可以取top{st.pop();++popi;}}return st.empty();}
};

3. queue OJ

1)二叉树的层序遍历(仅思路,带图解)

  • 思路一:双队列,队列_1 用于遍历二叉树,队列_2 用于记录节点对应的层数。

    如图,依次遍历,把遍历结果存储在队列中。当我们开始遍历,遍历到‘3’,记录此时层数为1;接着遍历‘3’的child节点,插入‘9’‘7’到队列中,记录此时的层数,即为上一层+1;如此循环。直到遍历完二叉树。

  • 思路二:双队列,队列_1 用于存储 parent 节点,队列_2 用于存储 child 节点。

  • 思路三:一个队列+一个变量,队列用于遍历二叉树,变量用于记录当前遍历到多少层。

2)逆波兰表达式求值

逆波兰表达式就是后缀表达式。逆波兰表达式求值就是后缀表达式的计算。

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

后缀表达式的计算

  • 中缀表达式:1 + 2 * 3
  • 后缀表达式:1 2 3 * + (ps.后缀表达式是没有括号的,因为括号的作用是提高操作符的优先级,而后缀表达式的操作符顺序已经表现了优先级)

思路:遍历后缀表达式,遇到操作数入栈,遇到操作符就取栈顶两元素运算,运算结果再入栈,如此循环,直到遍历完后缀表达式。图例如下。

后缀表达式的计算-图例

中缀表达式转后缀表达式(仅思路)

  • 思路:遍历中缀表达式,遇到操作数输出;遇到操作符,如果 stack 为空,那么 push 操作符入栈,如果 stack 不为空,那么比较栈顶元素与该操作符的优先级,如果该操作符优先级更高,那么 push 操作符入栈,如果栈顶元素优先级更高或两者优先级相等,就 pop 栈顶元素。(ps.遇到括号处理成递归子问题)

代码示例

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for(auto str:tokens){if(str == "+"||str == "-"||str == "*"||str == "/"){int right = st.top();st.pop();int left = st.top();st.pop();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;}}else{st.push(stoi(str));}}return st.top();}
};

4. 模拟实现 stack

库里的实现 → std::stack 

template <class T, class Container = deque<T> > class stack;

1)deque(简单了解)

deque 是一个结合了vector 和 list 功能的容器,但也同时结合了 vector 和 list 的双重优点和缺点。(优点多而优势不高,缺点多而缺陷不深)

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与 vector 比较,头插效率高,不需要搬移元素;与 list 比较,空间利用率比较高。

deque-图例

deque 和 vector 的效率比较(这个操作类似于 list 和 vector 的效率比较)
1.vector sort 的效率约为 deque 的 2倍;
2.通过把 deque 的数据拷贝到 vector 对其排序,都比直接用 deque 排序要快。(ps.通过这个操作我们可以侧面了解到数据拷贝的代价并不高)

sum.实际中 deque 并不常用,综合性比较强,但是优势又并不突出。

为什么选择deque作为stack和queue的底层默认容器

stack是一种后进先出的特殊线性数据结构,因此只要具有 push_back()pop_back() 操作的线性结构,都可 以作为stack的底层容器,比如vector 和 list 都可以;queue是 先进先出 的特殊线性数据结构,只要具有 push_back pop_front 操作的线性结构,都可以作为 queue 的底层容器,比如list。但是STL中对stack和 queue 默认选择 deque 作为其底层容器,主要是因为:

  1. stack 和 queue 不需要遍历(因此 stack 和 queue 没有迭代器),只需要在固定的一端或者两端进行操作。
  2. 在 stack 中元素增长时,deque 比 vector 的效率高(扩容时不需要搬移大量数据);queue 中的元素增长 时,deque不仅效率高,而且内存使用率高。 结合了 deque 的优点,而完美的避开了其缺陷。

2)模拟实现

思路:本质就是复用别的容器的函数接口。注意后进先出的原则。

代码示例

namespace Btl
{template<class T, class Con = deque<T>>class stack{public:void push(const T& x){_c.push_back(x);}void pop(){_c.pop_back();}T& top(){return _c.back();}const T& top()const{return _c.back();}size_t size()const{return _c.size();}bool empty()const{return _c.empty();}private:Con _c;};
};

5. 模拟实现 queue

同 stack,注意是先进先出的原则。

namespace Btl
{template<class T, class Con = deque<T>>class queue{public:void push(const T& x){_c.push_back(x);}void pop(){_c.pop_front();}T& back(){return _c.back();}const T& back()const{return _c.back();}T& front(){return _c.front();}const T& front()const{return _c.front();}size_t size()const{return _c.size();}bool empty()const{return _c.empty();}private:Con _c;};};

END

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字乡村创新之路:科技引领农村实现高质量发展

随着信息技术的快速发展&#xff0c;数字乡村建设已成为推动农村高质量发展的重要引擎。数字乡村通过科技创新&#xff0c;不仅改变了传统农业生产方式&#xff0c;也提升了乡村治理水平&#xff0c;为农民带来了更加便捷的生活。本文将从数字乡村的内涵、科技引领农村高质量发…

【网站项目】面向学生成绩分析系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Ruoyi-Cloud-Plus_使用Docker部署分布式微服务系统_环境准备_001---SpringCloud工作笔记200

1.首先安装docker: 如果以前安装过首先执行: yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 去卸载docker 2.安装dokcer需要的工具包…

单链表就地逆置

算法思想&#xff1a;构建一个带头结点的单链表L&#xff0c;然后访问链表中的每一个数据结点&#xff0c;将访问到的数据结点依此插入到L的头节点之后。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef s…

SSM框架学习——MVC模式与三层架构

MVC模式与三层架构 什么是MVC模式 MVC模式代表Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式。这种应用模式用于应用程序的分层开发。 Model代表存取数据的对象&#xff0c;它自身可带有逻辑&#xff0c;数据变化时更新Controller。View代表Model包含…

安达发|建材行业选择APS自动排程软件要遵循哪几点?

在建材行业中&#xff0c;选择合适的APS&#xff08;高级计划排程&#xff09;自动排程软件对于提高生产效率、减少浪费、优化资源配置和提升客户满意度至关重要。以下是选择APS自动排程软件时应遵循的几个关键点&#xff1a; 1. 行业特定需求&#xff1a;不同的建材企业可能有…

4.2学习总结

一.java学习总结 (本次java学习总结,主要总结了抽象类和接口的一些知识,和它们之间的联系和区别) 一.抽象类 1.1定义: 抽象类主要用来抽取子类的通用特性&#xff0c;作为子类的模板&#xff0c;它不能被实例化&#xff0c;只能被用作为子类的超类。 2.概括: 有方法声明&…

文献阅读:将条形码神经解剖学与空间转录分析相结合,可以识别投射神经元相关基因

文献介绍 「文献题目」 Integrating barcoded neuroanatomy with spatial transcriptional profiling enables identification of gene correlates of projections 「研究团队」 Anthony M. Zador&#xff08;美国冷泉港实验室&#xff09; 「发表时间」 2021-05-10 「发表期…

新闻管理系统(源码+文档)

新闻管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端新闻详情新闻首页分类退出登录个人中心拨打客服热线注册界面个人资料新闻评论成功 管理端用户管理分类管理新闻管理 文件包含内容 1、搭建视频 2、流程图 3、开…

基于opencv的SVM算法的车牌识别系统设计与实现

基于opencv的SVM算法的车牌识别系统设计与实现 车牌识别技术是智能交通系统中的一项关键技术&#xff0c;它能够自动识别车辆的车牌号码。本文将详细介绍如何使用Python编程语言结合OpenCV库和SVM算法来实现车牌识别系统。 系统架构 车牌识别系统主要包括以下几个模块&…

Win11电脑cpu温度过高怎么办呢

Win11电脑cpu温度过高怎么办呢&#xff1f;有时候我们感觉电脑发烫&#xff0c;担心电脑过烫会不会损坏。正常情况下&#xff0c;cpu的温度在45~65度之间&#xff0c;但不排除电脑同时开了太多软件&#xff0c;或者在玩吃鸡、英雄联盟等的大型游戏而导致温度超过85度。只要最高…

C 练习实例97 - 读磁盘 写磁盘

题目&#xff1a;从键盘输入一些字符&#xff0c;逐个把它们送到磁盘上去&#xff0c;直到输入一个‘#’为止 在桌面新建一个hello.txt文件&#xff0c;内容示例&#xff1a; 代码&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {FILE *fp; //文…

JVM 记录

记录 工具 https://gceasy.io 资料 尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09; https://www.bilibili.com/video/BV1PJ411n7xZ?p361 全套课程分为《内存与垃圾回收篇》《字节码与类的加载篇》《性能监控与调优篇》三个篇章。 上篇《内存与垃圾回收篇…

​LeetCode解法汇总1379. 找出克隆二叉树中的相同节点

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你两棵二叉树&#xff0c;原始树 origi…

特征增强自蒸馏卷积神经网络

目录 1.1 模型总体架构 1.2 特征增强金字塔模块 1.3 辅助分类器 1.1 模型总体架构 与自然图像相比&#xff0c;遥感场景图像地物较为复杂&#xff0c;具有类间相似度高和类内差异大的特点&#xff0c;这导致常用的网络模型难以有效学习遥感场景图像的表征特征。此外&#xf…

数据分析之POWER BI Desktop可视化应用案列

在power bi中导入数据 导入前期建好的模型 简单介绍&#xff08;power bi desktop&#xff09; 将右边字段全部展开 各类数据 所作的模型 在excel中是单向的&#xff0c;power bi 中可以是双向的 右键单击----点击属性 选择两个---在两个方向上应用安全筛选器 变为双向的…

如何使用Java语言发票查验接口实现发票真伪查验、票据ocr

随着时代潮流的发展&#xff0c;企业也在寻找更加便捷、高效的办公模式&#xff0c;尤其是针对财务工作人员而言&#xff0c;繁琐的发票录入、查验工作占据了财务人员的大部分时间。对此&#xff0c;翔云提供了发票识别接口、发票查验接口&#xff0c;那么企业应当如何将这些接…

【微服务】软件架构的演变之路

目录 单体式架构的时代单体式架构(Monolithic)优点缺点适用场景单体式架构面临诸多问题1.宽带提速&#xff0c;网民增多2.Web2.0时代的特点问题描述优化方向 集群优点缺点适用场景搭建集群后面临诸多问题用户请求问题用户的登录信息数据查询 改进后的架构 垂直架构优点缺点 分布…

Windows10下安装wget

文章目录 1. 查看是否安装2. 通过exe安装3. 通过解压缩包 wget 是一个从网络上自动下载文件的自由工具&#xff0c;支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载&#xff0c;并可以使用 HTTP 代理。“wget” 这个名称来源于 “World Wide Web” 与 “get” 的结合。…

MySQL-linux安装-万能RPM法

一、MySQL的Linux版安装 1、 CentOS7下检查MySQL依赖 1. 检查/tmp临时目录权限&#xff08;必不可少&#xff09; 由于mysql安装过程中&#xff0c;会通过mysql用户在/tmp目录下新建tmp_db文件&#xff0c;所以请给/tmp较大的权限。执行 &#xff1a; chmod -R 777 /tmp2. …