C++刷题(二):栈 + 队列

📝前言说明:
本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C++。
每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的讲解,主要是个人见解,如有不正确,欢迎指正,一起进步!

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C++学习笔记,C语言入门基础,python入门基础,python刷题专栏
🎀CSDN主页 愚润泽

题目

  • 20. 有效的括号
  • 225. 用队列实现栈
  • 232. 用栈实现队列
  • 622. 设计循环队列
  • 面试题03.05. 栈排序

20. 有效的括号

经典的括号匹配题:利用栈。遇到左括号:入栈,遇到右括号:出栈
不过写代码时要注意:因为我们要让'(' 匹配 ')',所以遇到左括号时,直接将它对应的右括号入栈,后续可以直接字符比较判断。
在这里插入图片描述

class Solution {
public:bool isValid(string s) {stack<char> st;for(auto ch : s){if(ch == '('){st.push(')'); // 需要匹配的}else if (ch == '['){st.push(']');}else if (ch == '{'){st.push('}');}else{if( st.empty() || ch != st.top()){ // 这里要先判断栈是否为空return false;}st.pop();}}return st.empty();}
};

225. 用队列实现栈


首先我们要了解栈的特点:先进后出,队列的特点:先进先出
因此,这道题的难点在于:如何让新入队的元素处于队头?

这道题给了我们两个队列,如果将一个队列当做主队列(即栈),另一个队列作为辅助队列,我们就可以利用辅助队列来改变新入队的元素的位置:
前提:每次操作前,辅助队列要为空。
思想:如果直接让新元素进主队列,那这个元素肯定是最后一个了,但是直接让新元素进辅助队列,那这个新元素就是辅助的第一个元素。所以我们先让新元素进入辅助队列,然后再把主队列(栈)里的元素依次出栈放入辅助队列,这样在辅助队列里新元素第一个出队列,而其他元素的出队列顺序与原来的主队列(栈)保持一致。这时候我们再交换辅助队列和主队列的身份。

class MyStack {
public:queue<int> queue1; queue<int> queue2; MyStack() {}void push(int x) {queue2.push(x); // 把新元素放到辅助队列while(!queue1.empty()){queue2.push(queue1.front()); // 依次将栈的元素放入辅助队列queue1.pop();}swap(queue1, queue2);}int pop() {int r = queue1.front();queue1.pop();return r;}int top() {return queue1.front();}bool empty() {return queue1.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

232. 用栈实现队列

在这里插入图片描述
只需要让一个栈进,一个栈负责出就行了。当一个栈的元素全部倒入另一个栈,这时候元素的出入顺序就会完全改变一次。(为了节约时间,我们只在outStack里面元素彻底为空且遇到出栈需求时,才将inStack的数据倒入`outStack)

class MyQueue {
public:stack<int> inStack, outStack;void in_to_out(){ // 倒转while(!inStack.empty()){outStack.push(inStack.top());inStack.pop();}}MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if(outStack.empty()){in_to_out();}int r = outStack.top();outStack.pop(); return r;}int peek() {if(outStack.empty()){in_to_out();}return outStack.top();}bool empty() {return inStack.empty() && outStack.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

622. 设计循环队列

在这里插入图片描述
下面解法以数组为例:
环形队列的关键在于:1,如何通过取模来达到走环的效果;2,如何判断队列满和空的情况。
对于循环:当一个数+1时可能超出最大值,则需要%来控制此数的大小任然在下标范围内;
对于判空:起始时front指针和rear指针都指向空;对于满,我们可以牺牲一个空间,即:当rear+1 == front的时候为满(但注意rear + 1要确保在数组下标内)。
下面做法以front的后一位为第一个数据位为例:

class MyCircularQueue {
public:// 用数组来模拟循环队列,让front指向的位置为空,front下一个位置才有节点// front == rear时为空,当 rear + 1 == front 时为满 MyCircularQueue(int k) {capacity = k;front = rear = 0;que = vector<int> (k+1); // 比容量多开一个空间,则数组下标为[0, k](后续我们要让rear和front的下标在这个范围内,不然会越界)}bool enQueue(int value) {if(isFull()){return false;}rear = (rear + 1) % (capacity + 1);  que[rear] = value;return true;}bool deQueue() {if(isEmpty()){return false;}front = (front + 1) % (capacity + 1);return true;}int Front() {if(isEmpty()){return -1;}return que[(front + 1) % (capacity + 1)];}int Rear() {if(isEmpty()){return -1;}return que[rear];}bool isEmpty() {return rear == front;}bool isFull() {return ((rear + 1) % (capacity + 1)) == front;}private:int front;int rear;int capacity;vector<int> que;
};/*** Your MyCircularQueue object will be instantiated and called as such:* MyCircularQueue* obj = new MyCircularQueue(k);* bool param_1 = obj->enQueue(value);* bool param_2 = obj->deQueue();* int param_3 = obj->Front();* int param_4 = obj->Rear();* bool param_5 = obj->isEmpty();* bool param_6 = obj->isFull();*/

面试题03.05. 栈排序

在这里插入图片描述
这道题的题目表述不清楚,看示例可以发现,实际上是往栈里面插入元素,要保证插入后的顺序从栈底到栈顶是从大到小的。
我们只需要将每次要插入的元素和栈中已经有的元素作比较,找到合适的位置插入。
如:栈顶元素为t,要插入元素为val,如果val < t,就直接入栈,否则,先让t进入辅助栈,重复此过程,直到找到合适的位置插入,插入完后,把st2的元素倒回来。

class SortedStack {
public:SortedStack() {}void push(int val) {while( !st1.empty() && st1.top() < val){st2.push(st1.top()); // 把st1的元素暂存到st2st1.pop();}st1.push(val);// 把st2的元素倒回来while(!st2.empty()){st1.push(st2.top());st2.pop();}}void pop() {if(!st1.empty()){st1.pop();}}int peek() {if(!st1.empty()){return st1.top();}return -1;}bool isEmpty() {return st1.empty();}
private:stack<int> st1, st2;
};/*** Your SortedStack object will be instantiated and called as such:* SortedStack* obj = new SortedStack();* obj->push(val);* obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->isEmpty();*/

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

精通游戏测试笔记(持续更新)

第一章、游戏测试的两条规则 不要恐慌 不要将这次发布当作最后一次发布 不要相信任何人 把每次发布当作最后一次发布 第二章&#xff1a;成为一名游戏测试工程师

Windows功能之FTP服务器搭建

一、创作背景 之前有用linux系统搭建过ftp服务器&#xff0c;最近想着用windows系统也顺便搭建一个&#xff0c;看网上有第三方服务软件一键部署&#xff0c;记得windows可以不借助第三方软件就可以搭建&#xff0c;就想顺便操作试试&#xff0c;结果老是连接不上&#xff0c;费…

星型组网模块的两种交互方式优缺点解析

星型组网模块简介 星型组网模块工作在433MHz频段&#xff1b;星型组网模块集主机&#xff08;协调器&#xff09;、终端为一体&#xff0c;星型组网模块具有长距离、高速率两种传输模式&#xff0c;一个主机&#xff08;协调器&#xff09;支持多达200个节点与其通讯&#xff0…

二分+前缀和——森林的最大美丽值

森林的最大美丽值(二分差分数组) 题目分析 求最小值的最大值&#xff0c;联想到二分。 第一阶段二段性分析 对于所有树的高度都可以大于等于mid&#xff0c;那么我们可以确定高度小于mid的值一定也可以&#xff0c;但是此时我需要找的是最大的高度&#xff0c;那么mid一定比…

Pytorch实现之最小二乘梯度归一化设计

简介 简介:LSGAN提出了一种利用最小二乘法来计算两个数据分布之间的距离,该论文在此基础上采用梯度归一化来进一步稳定训练。 论文题目:LSN-GAN: A Novel Least Square Gradient Normalization for Generative Adversarial Networks(LSN-GAN:一种新的生成对抗网络的最小…

JavaScript基础-全局作用域

在JavaScript编程中&#xff0c;理解变量的作用域是编写高效、可维护代码的关键之一。全局作用域是指变量在整个程序范围内都可访问的状态&#xff0c;这意味着它们可以在任何函数或代码块中被读取和修改。然而&#xff0c;过度使用全局变量也可能导致一些问题&#xff0c;如命…

【2025.3.13】记一次双系统笔记本加装固态硬盘记录 linux扩容 linux更换/home和/opt所在硬盘 windows无法调整亮度

文章目录 &#x1f315;事情经过&#x1f315;更换/home和/opt的挂载硬盘&#x1f319;目的&#x1f319;初始化1t固态硬盘&#x1f319;打开Linux查看硬盘信息&#x1f319;给新1t固态硬盘分区&#x1f319;格式化分区&#x1f319;把新1t固态硬盘先挂载到/mnt/ssd_1t 用于后续…

山东省新一代信息技术创新应用大赛-计算机网络管理赛项(样题)

目录 竞赛试题 网络拓扑 配置需求 虚拟局域网 IPv4地址部署 OSPF及路由部署 配置合适的静态路由组网 MSTP及VRRP链路聚合部署 IPSEC部署 路由选路部署 设备与网络管理部署 1.R1 2.R2 3.S1 4.S2 5.S3 竞赛试题 本竞赛使用HCL(华三云实验室)来进行网络设备选择…

【测试语言基础篇】Python基础之List列表

一、Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置&#xff0c;或索引&#xff0c;第一个索引是0&#xff0c;第二个索引是1&#xff0c;依此类推。 Python有6个序列的内置类型&#xff0c;但最常见的是列表和元组。序列都可…

大数据面试之路 (二) hive小文件合并优化方法

大量小文件容易在文件存储端造成瓶颈&#xff0c;影响处理效率。对此&#xff0c;您可以通过合并Map和Reduce的结果文件来处理。 一、合并小文件的常见场景 写入时产生小文件&#xff1a;Reduce任务过多或数据量过小&#xff0c;导致每个任务输出一个小文件。 动态分区插入&…

MySQL 批量插入 vs 逐条插

MySQL 插入数据&#xff1a;批量插入 vs 逐条插入&#xff0c;哪个更快&#xff1f; 在 MySQL 中&#xff0c;插入数据有两种常见方式&#xff1a; 批量插入&#xff1a;一条 SQL 插入多条数据。逐条插入&#xff1a;每次插入一条数据。 这两种方式有什么区别&#xff1f;哪…

Docker基础命令说明

Docker基础操作命令众多&#xff0c;这些命令可以按如下方式进行分类&#xff1a; 镜像操作容器操作网络操作数据卷操作LOG查询 等方面进行分类。 一、镜像操作命令 docker images&#xff1a;用于列出本地系统中所有的 Docker 镜像。镜像就像是一个模板&#xff0c;它包含…

AI重构私域增长:从流量收割到终身价值运营的三阶跃迁

私域运营的AI进化论&#xff1a;内容即服务的三个阶段 随着企业微信生态的成熟&#xff0c;私域运营正经历从"流量收割"到"关系养成"的本质转变。在AIGC技术的推动下&#xff0c;2024年私域场景正式进入**"内容即服务"**的价值共创期&#xff1…

Linux date 命令使用指南

date 命令用于 显示或设置系统日期和时间&#xff0c;支持灵活的时间格式化和计算。以下是常用场景与详细示例&#xff1a; 一、基本用法 1. 显示当前日期和时间 <BASH> date # 输出&#xff1a;Thu Jun 13 14:25:36 CST 20242. 设置系统时间&#xff08;需root权限&am…

Maven的依赖管理

maven相关依赖的官网&#xff1a;https://mvnrepository.com/ pom.xml是项目依赖的配置文件 maven首先会去本地仓库下载相关依赖&#xff0c;如果没有&#xff0c;则会去私服下载&#xff0c;再没有&#xff0c;就去中央仓库或镜像下载。 自定义properties&#xff0c;可使用…

Mybaties批量操作

1、批量插入 <!--批量操作-插入--><!-- 相当于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…

向量库集成指南

文章目录 向量库集成指南Chroma集成Pinecone集成MiLvus集成向量库集成指南 向量库是一种索引和存储向量嵌入以实现高效管理和快速检索的数据库。与单独的向量索引不同,像Pinecone这样的向量数据库提供了额外的功能,例如,索引管理、数据管理、元数据存储和过滤,以及水平扩展…

软件测试之使用Requests库进行接口测试

文章目录 前言Requests库是什么为什么要用Requests库进行接口测试安装Requests库Requests库使用发送GET请求发送带查询参数的GET请求响应内容格式添加请求头信息发送一个POST请求查看响应内容断言请求超时Cookie与Session模拟登录 参考目录 前言 阅读本文前请注意最后编辑时间…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

AttributeError: module backend_interagg has no attribute FigureCanvas 这个错误通常是由于 Matplotlib 的后端配置问题引起的。具体来说&#xff0c;Matplotlib 在尝试加载某个后端时&#xff0c;发现该后端模块中缺少必要的属性&#xff08;如 FigureCanvas&#xff09;&a…

iWebOffice2015 中间件如何在Chrome107及之后的高版本中加载

iWebOffice2015是江西金格科技有限公司开发的一款智能文档中间件&#xff0c;和一些知名OA及ERP公司曾经达成OEM合作&#xff0c;所以用户一度比较多&#xff0c;但不幸的是Chromium内核浏览器在2022年10月份发布的107版本中永久取消了对PPAPI插件的加载支持&#xff0c;导致使…