【C++】stack/queue

链表完了之后就是我们的栈和队列了,当然我们的STL中也有实现,下面我们先来看一下简单用法,跟我们之前C语言实现的一样,stack和queue有这么几个重要的成员函数

最主要的就是这么几个:empty,push,pop,top(front),size,为什么要说这几个重要的呢?因为我们发现,stack和queue并没有我们之前的容器的迭代器,说明它们跟之前学的容器并不同,它们叫做适配器

什么叫做适配器呢?我们听过笔记本电脑的电源适配器,它就是将220V的电压转化成电脑需要的电压,所以适配器的本质是转换回到我们这里,stack和queue这个适配器就可以将其他的容器转换成实例化后的stack和queue

我们可以看到,类模板的第二个参数是要传一个容器,当然不传也行,它是有缺省值的,这里的缺省值是deque,这个容器是介于vector和list之间的,为什么要有一个这样的容器呢?

我们首先来总结一下vector和list的优缺点

vector:优点是下标随机访问和缓存命中率高(缓存命中率就是指比如我要给定vector中连续几个元素的值,我要一个一个给定,当我给定第一个的时候,它并不是只把第一个给定到内存中,而是把它及周围的位置都拿到了内存中,这样我给定第二个值时,就不需要再拿入到内存中了),缺点是前面部分插入删除效率低,扩容有消耗

list:优点是任意位置插入删除效率高和按需申请释放(每次就申请一个节点的空间,不会浪费),缺点是不支持下标随机访问,缓存命中率低

我们可以来试一下

既然如此,我们要模拟实现的话,就不用像之前那么写了,而是跟库一样,模板参数传个容器,下面的几个关键函数赋用容器的就可以了

template<class T,class container>
class stack {
public:void push(const T& x) {_con.push_back(x);}void pop() {_con.pop_back();}bool empty() {return _con.size() == 0;}const T& top() {return _con.back();}size_t size() {return _con.size();}
private:container _con;
};
template<class T, class container>
class queue {
public:void push(const T& x) {_con.push_back(x);}void pop() {_con.pop_front();}bool empty() {return _con.size() == 0;}const T& front() {return _con.front();}size_t size() {return _con.size();}
private:container _con;
};

下面来几道有关的题来帮助我们更好的使用

这个题其实就是模拟我们人脑在做这种题时的想法,我们一般先看弹出顺序的第一个,然后看怎么怎么压入才会让它第一个弹出。第一个其实跟后边几个都一样,最后走到头,看栈是否为空,为空就是符合

class Solution {public:bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {stack<int>s;int n = popV.size();for (int pushi = 0, popi = 0; pushi < n && popi < n;) {while (s.empty() || s.top() != popV[popi]) {s.push(pushV[pushi++]);if (pushi == n)break;}while (!s.empty() && s.top() == popV[popi]) {s.pop();popi++;}}if (s.empty())return true;return false;}
};

这里实际上就是给你一个后缀表达式,让你求出表达式的值,我们人一般看的就是中缀表达式,那么后缀表达式是什么呢?其实就是把运算符放到两个操作数的后面。所以解题思路就是看到数字就入栈,看到运算符就从栈中取两个值进行运算,把结果再放到栈中,直到把后缀表达式走完

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

我们这里是给定一个后缀表达式,那么我们应该如何求一个中缀表达式的后缀表达式呢?我这里简单实现了一下,可以传一个string,string里面要么是字母用来表示数字,要么是+-*/

string postfix(string s) {stack<char>st;string ret;for (int i = 0; i < s.size();) {char e = s[i];if (e == '+' || e == '-' || e == '*' || e == '/') {if (st.empty()) {st.push(e);i++;}else if ((e == '*' || e == '/') && (st.top() == '+' || st.top() == '-')) {st.push(e);i++;}else {ret += st.top();st.pop();}}else if (e == '(') {int j = i;int k = j;int num = 1;for (k = j+1; k < s.size(); k++) {if (s[k] == '(')num++;if (s[k] == ')'&&num==1)break;if (s[k] == ')')num--;}string tmp(s.begin() + j + 1, s.begin() + k);ret += postfix(tmp);i+=k-j+1;}else {ret += e;i++;}}while (!st.empty()) {ret += st.top();st.pop();}return ret;
}

先简单说一下一个正常的式子转后缀表达式是什么逻辑,先说没有括号的情况下

给一个string,从左向右开始:先创建一个栈

1.如果遇到非运算符直接写入到最终结果中

2.如果遇到运算符,(1).如果栈为空或此运算符比栈顶运算符的优先级高,那么就入栈;(2).如果优先级相等或低,那么栈顶元素出栈,放到最终结果,继续仍然用此运算符进行下一轮判断

一直循环,直到string结束,最后把栈中的都移入到最终结果

如果有括号,将括起来的部分进行函数递归,重复上述过程,把递归完之后的结果加入到最终结果中

层序遍历肯定是要用到队列的,这个题的返回值告诉我们要一层一层的给到vector中,这就要求我们记录下每一层的节点个数才可以

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ret;if (root == nullptr)return ret;queue<TreeNode*> qu;qu.push(root);int levelsize = qu.size();while(!qu.empty()){vector<int>f;while(levelsize--){TreeNode* tmp=qu.front();qu.pop();f.push_back(tmp->val);if(tmp->left!=nullptr)qu.push(tmp->left);if(tmp->right!=nullptr)qu.push(tmp->right);}ret.push_back(f);levelsize=qu.size();}return ret;}
};

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

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

相关文章

LeetCode-91题:解码方法(原创)

【题目描述】 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种…

如何获取国外信用卡?需要国外银行卡支付怎么解决?如何订阅国外产品?

当国内的用户想要使用国外的产品时&#xff0c;很多产品是需要订阅付费的。其中有些产品还没有引入国内&#xff0c;只能用国外的信用卡支付&#xff0c;对于在国内的朋友&#xff0c;如何获取一张国外的信用卡呢&#xff1f; 这里推荐一个平台&#xff1a;wildCard waildCard…

2核4g服务器能支持多少人访问?并发数性能测评

2核4g服务器能支持多少人访问&#xff1f;支持80人同时访问&#xff0c;阿腾云使用阿里云2核4G5M带宽服务器&#xff0c;可以支撑80个左右并发用户。阿腾云以Web网站应用为例&#xff0c;如果视频图片媒体文件存储到对象存储OSS上&#xff0c;网站接入CDN&#xff0c;还可以支持…

String 的使用注意事项

String类型变量不可变 string类型的变量不可变&#xff0c;下面的拼接是怎么回事呢? // 拼接字符串 String str1 "hello"; String str2 "world"; String str3 str1 str2; System.out.println(str3);拼接都会新建 一个常量字符串一个拼接之后的字符串 …

【Unity】分拣机的数字双胞胎集成到Unity3D开发平台中

Unity HMI 一、前言 该项目的重点是通过OPC UA进行客户端-服务器通信的简单演示&#xff0c;该演示在Unity3D中实现&#xff08;服务器- B&R Automation PLC&#xff0c;客户端- Unity3D&#xff09;。该项目展示了数字孪生的分拣机与一些额外的功能。该应用程序使用多线程…

S32 Design Studio PE工具配置ADC

工具配置 我这个K1芯片有两个ADC驱动&#xff0c;也就有两个components&#xff0c;点开之后每个components都有四个选项卡converter转换器、channel通道、compare比较器、average求平均。 配置引脚 配置之前&#xff0c;得先配置好引脚&#xff0c;哪个引脚用来采集ADC。 每…

亚洲股市下一步的关键:中国看财报、日本看汇率、韩国看治理、印度看基建

汇丰认为财报将是驱动中国股市走势的关键因素。目前市场预计2024年中国企业每股收益将增长16%。 日本央行转向、A股业绩复苏、印度基建、韩国市场改革......最近这段时间&#xff0c;亚洲各大市场涌现出了不同的交易主题。 汇丰银行指出&#xff0c;中国受到本土企业盈利能力…

域控操作八:下发打印机策略

、此方法可以直接下发打印机&#xff0c;加域OU后自动连接 1&#xff0c;在域控服务器上安装打印机确保域控可以让打印机使用 并且要开共享入目录 这个共享路径正常情况下应该是在运行里面输入是直接能连接打印机的

算法——链表王

链表刷题详解 203.移除链表元素 力扣题目链接(opens new window) 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head []…

数据库(mysql)-新手笔记(主外键,视图)

主外键 主键(唯一性,非空性) 主键是数据库表中的一个或多个字段&#xff0c;其值唯一标识表中的每一行/记录。 唯一性: 主键字段中的每个值都必须是唯一的&#xff0c;不能有两个或更多的记录具有相同的主键值 非空性&#xff1a;主键字段不能包含NULL值。 外键(引用完整 …

AutoPSA里给定了弹簧刚度,为什么计算没有引用?

山东一用户问&#xff1a;已经给定了弹簧刚度&#xff0c;为什么计算没引用&#xff1f; 在AutoPSA里包含两种算法仿CAESARII &#xff0c;仿GLIF算法。 在仿CAESARII算法里直接给定弹簧刚度与安载荷载&#xff0c;两个都给了相应值&#xff0c;也就是给定了弹簧号&#xff1b…

处理error: remote origin already exists.及其Gitee文件上传保姆级教程

解决error: remote origin already exists.&#xff1a; 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin &#xff08;HTTPS&#xff09; 比如这样&#xff1a; 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…

Python实习生(自动化测试脚本开发) - 面经 - TCL新技术有限公司

JD&#xff1a; 招聘流程&#xff1a; 2024.1.3 Boss直聘 沟通 2024.1.4 约面 2024.1.6 上午面试 面试流程&#xff1a; 上来第一步&#xff0c;直接问Python基础语法&#xff0c;讲一下基础的数据类型 就记得元组和字典 分别具体说一下元组和字典 流程控制语句有哪些&…

应急布控球远程视频监控方案:视频监控平台EasyCVR+4G/5G应急布控球

随着科技的不断发展&#xff0c;应急布控球远程视频监控方案在公共安全、交通管理、城市管理等领域的应用越来越广泛。这种方案通过在现场部署应急布控球&#xff0c;实现对特定区域的实时监控&#xff0c;有助于及时发现问题、快速响应&#xff0c;提高管理效率。 智慧安防视…

SPFA找负环

2024-01-31&#xff08;最短路径&#xff09;-CSDN博客 求负环的常用方法&#xff0c;基于spfa&#xff1a; 1.统计每个点入队的次数&#xff0c;如果有个点入队n次&#xff0c;则说明存在负环 2.统计当前每个点的最短路中包含的边数&#xff0c;如果某个点的最短路的所包含的边…

QT:用opencv的KNN识别图片中的LED数字(一)

前言 一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。 (正在写,未完成,稍候) 效果一预览: 效果二预览: 效果三预览: 正在写。。。 设计思路 1. 软件UI设…

【uni-app】condition 启动模式配置,生产环境无效,仅开发期间生效

在小程序开发过程中&#xff0c;每次代码修改后&#xff0c;都会启动到首页&#xff0c;有时非常不方便&#xff0c;为了更高效的开发&#xff0c;有时需要模拟直接跳转到指定的页面&#xff0c; 操作方法如下&#xff1a; 在pages.joson里面配置下列代码&#xff1a; "…

Mybatis-Spring | Mybatis与Spring的“整合“

目录 : 一、配置环境1. 整合环境需导入的JAR :Spring框架所需JARMybatis框架所需JARMyBatis与Spring整合的中间JAR数据库驱动JAR包数据源所需JAR包 &#xff08;下面的例子中 : 用的不是这个数据源&#xff09; 2. 编写“配置文件” 和 “.properties文件” ( 只是概述&#xf…

Claude3真的超越GPT4了吗?

一文探究Claude3真实能力 Claude3就在昨天悄无声息的上线了&#xff0c;OpenAI的好兄弟Anthropic公司仅仅在推特上发了一条消息来宣布这件事情。 Anthropic这次一下就发了三个模型&#xff1a;Opus、Sonnet、Haiku。说实话这名字感觉取得不咋地&#xff0c;主要是看不懂&#x…

图机器学习(3)-面向节点的人工特征工程

0 问题引入 地铁导航图 计算机是看不懂这些图&#xff0c;计算机只能看懂向量、矩阵。 传统图机器学习只讨论连接特征。 构造一个新的特征 x 1 x 2 x_1x_2 x1​x2​&#xff0c;有利于分开这种数据。 人需要去翻译这些计算机不懂的特征&#xff0c;变成计算机可以懂…