秒懂百科,C++如此简单丨第二十一天:栈和队列
目录
前言
Everyday English
栈(Stack)
图文解释
实现添加删除元素
实现查看清空栈
完整代码
运行示例
栈的选择题
队列(Queue)
图文解释
队列的基本用法
完整代码
运行结果
队列的好处
结尾
前言
今天我们将学习两个新的数据结构——栈和队列。
Everyday English
A friend in need is a friend indeed.
患难见真情。
栈(Stack)
图文解释
栈最直白的想象就是羽毛球筒了(假设从一个口取)。
比如说我想按照红-橙-黄的顺序放进去,并取出橙色羽毛去,得进行以下操作:
1.放入红-橙-黄色羽毛球。
2.取出顶部的黄色羽毛球。
3.取出顶部的橙色羽毛球。
下面请欣赏我的纯手绘图片:

现在请你把注意力放在黄色羽毛球上,它在放进筒时是最后一个放进去的,而被取出来时是第一个被取出来的;而红色羽毛球却是最后一个被取出来的。所以栈有一个很重要的性质:
先进后出,后进先出(LIFO:Last in first out)
实现添加删除元素
添加:将元素入栈并使指针右移一位。
void add(int n)//添加元素至栈顶
{tmp++;a[tmp]=n;
}
删除:将元素出栈并使指针左移一位。
void pop()//删除栈顶元素
{a[tmp]=0;//这一步可要可不要tmp--;
}
实现查看清空栈
查看:把数组从1-tmp输出一下即可。
void look(int n[])
{for(int i=1;i<=tmp;i++){cout<<n[i]<<" ";}
}
清空:把数组归零,并把指针赋值为1。
void empty(int n[])
{for(int i=1;i<=tmp;i++){n[i]=0;}tmp=0;
}
完整代码
#include<bits/stdc++.h>
using namespace std;
string op="";
int a[1005],tmp=0,n;
char b[1005],m;
void add(int n)//添加元素至栈顶
{tmp++;a[tmp]=n;
}
void pop()//删除栈顶元素
{a[tmp]=0;//这一步可要可不要tmp--;
}
void look(int n[])
{cout<<"The stack is:"; for(int i=1;i<=tmp;i++){cout<<n[i]<<" ";}
}
void empty(int n[])
{for(int i=1;i<=tmp;i++){n[i]=0;}tmp=0;cout<<"The stack is empty now."<<endl;
}
int main()
{memset(a,0,sizeof(a));while(1){cin>>op;if(op[0]=='s') return 0;else {if(op[0]=='a') cin>>n,add(n);if(op[0]=='p') pop();if(op[0]=='l') look(a);if(op[0]=='e') empty(a);}}
}
运行示例
add 1
add 2
add 3
add 4
pop
pop
look
The stack is:1 2
add 5
empty
The stack is empty now.
add 6
look
The stack is:6
栈的选择题
栈虽然编程中用的不是特别多,但是在CSP的第一轮考试中经常出现,我们来看一看。
1.有6个元素,按照6、5、4、3、2、1的顺序入栈S,请问下列哪个出栈顺序是非法的?
A.5 4 3 6 1 2
B.4 5 3 1 2 6
C.3 4 6 5 2 1
D.2 3 4 1 5 6
题目来源:2022 CSP-J 选择第二题
解析:因为6比5先入栈,所以出栈时6应该在5后面,故选C。当然你也可以模拟一下。
2.对于入栈顺序为a,b,c,d,e的序列,下列( )不是合法的出栈序列。
A.a,b,c,d,e
B.e,d,c,b,a
C.b,a,c,d,e
D.c,d,a,e,b
题目来源:2021 CSP-J 选择题第五题
解析:因为a比b先入栈,所以出栈时a应该在b后面,故选D。当然你也可以模拟一下。
A.进栈一个,出栈一个
B.全部进栈,全部出栈
C.a进栈,b进栈,b出栈,a出栈,剩下的进栈一个,出栈一个。
D.无法完成
3.下图中所使用的数据结构是?

A、栈
B、队列
C、二叉树
D、哈希表
栈的性质是:后进先出,故选A。
队列(Queue)
图文解释
队列顾名思义就是排队买票,先买票的人总是先出来,最后买票的人最后出来。

如上图,1号游客最先排队,所以他第一个买票也是第一个出来的,这就是队列的重要性质:
先进先出,后进后出(FIFO:First in first out)
队列的基本用法
在C++中,已经有为我们写好的队列了,我们只需直接使用即可。
首先需要定义一个队列:
queue<变量类型> q;
这个变量类型可以是int,double,long long,struct......
下面是队列的几个基本用法:
q.pop() //弹出队首元素
q.push(item) //把元素item插入到队尾
q.empty() //如果队列为空返回True,否则返回False
q.full() //如果队列已满返回True,否则返回False
q.front() //调用队首元素
q.size() //返回队列中元素的数量
完整代码
#include<bits/stdc++.h>
using namespace std;
int main()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.pop();cout<<q.front()<<endl;q.pop();cout<<q.size()<<endl;q.pop();if(q.empty()) cout<<"The queue is empty."<<endl;return 0;
}
运行结果
2
1
The queue is empty.
队列的好处
等我们后面学到BFS时,会用到很多有关于队列的知识。
结尾
本篇文章我们学习了栈和队列,图片为纯手绘无参考,制作不易,还请各位大佬三连支持一下!
相关文章:
秒懂百科,C++如此简单丨第二十一天:栈和队列
目录 前言 Everyday English 栈(Stack) 图文解释 实现添加删除元素 实现查看清空栈 完整代码 运行示例 栈的选择题 队列(Queue) 图文解释 队列的基本用法 完整代码 运行结果 队列的好处 结尾 前言 今天我们将…...
STM32-开发环境之STM32CubeMX
目录 STM32CubeMX介绍 STM32CubeMX特性 应用场景 其他事项 STM32CubeMX介绍 STM32CubeMX是ST公司(意法半导体)推出的一款图形化工具,也是配置和初始化C代码生成器。它主要服务于STM32微控制器的配置和开发。 STM32CubeMX特性 1.直观选…...
[晓理紫]CCF系列会议截稿时间订阅
CCF系列会议截稿时间订阅 VX 关注{晓理紫},每日更新最新CCF系列会议信息,如感兴趣,请转发给有需要的同学,谢谢支持!! 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新CCF会议…...
重复导航到当前位置引起的。Vue Router 提供了一种机制,阻止重复导航到相同的路由路径。
代码: <!-- 侧边栏 --><el-col :span"12" :style"{ width: 200px }"><el-menu default-active"first" class"el-menu-vertical-demo" select"handleMenuSelect"><el-menu-item index"…...
如何在 Angular 中使用 Flex 布局
介绍 Flex Layout 是一个组件引擎,允许您使用 CSS Flexbox 创建页面布局,并提供一组指令供您在模板中使用。 该库是用纯 TypeScript 编写的,因此不需要外部样式表。它还提供了一种在不同断点上指定不同指令以创建响应式布局的方法。 在本教…...
通俗的讲解什么是机器学习之损失函数
想象一下,你在玩一个靶心射击的游戏,你的目标是尽可能让箭簇命中靶心。在这个游戏中,损失函数可以看作是测量你的箭簇与靶心距离的规则。损失函数的值越小,意味着你的箭簇离靶心越近,你的射击技能越好。 在机器学习中…...
快速搭建PyTorch环境:Miniconda一步到位
快速搭建PyTorch环境:Miniconda一步到位 🌵文章目录🌵 🌳一、为何选择Miniconda搭建PyTorch环境?🌳🌳二、Miniconda安装指南:轻松上手🌳🌳三、PyTorch与Minic…...
图灵日记之java奇妙历险记--抽象类和接口
目录 抽象类概念抽象类语法 接口概念规则使用特性实现多个接口接口的继承接口使用实例Clonable接口和深拷贝抽象类和接口的区别 Object类 抽象类 概念 在面向对象的概念中,所有对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够…...
批量给元素添加进场动画;获取文本光标位置;项目国际化
批量给元素添加进场动画 api及参数参考:https://juejin.cn/post/7310977323484971071 简单实现: addAnimationClass(){//交叉观察器if (window?.IntersectionObserver) {//获取所有需要添加进场动画的元素,放到一个数组let items [...do…...
解决:docker创建Redis容器成功,但无法启动Redis容器、也无报错提示
解决:docker创建Redis容器成功,但无法启动Redis容器、也无报错提示 一问题描述:1.docker若是直接简单使用run命令,但不挂载容器数据卷等参数,则可以启动Redis容器2.docker复杂使用run命令,使用指定redis.co…...
Jlink+OpenOCD+STM32 Vscode 下载和调试环境搭建
对于 Mingw 的安装比较困难,国内的网无法正常在线下载组件, 需要手动下载 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 版本的软件包,添加环境变量,并将 mingw32-make.exe 名字改成 make.exe。 对于 OpenOCD,需要…...
单片机在物联网中的应用
单片机,这个小巧的电子设备,可能听起来有点技术性,但它实际上是物联网世界中的一个超级英雄。简单来说,单片机就像是各种智能设备的大脑,它能让设备“思考”和“行动”。由于其体积小、成本低、功耗低、易于编程等特点…...
16.Qt 工具栏生成
目录 前言: 技能: 内容: 1. 界面添加 2. 信号槽 功能实现 参考: 前言: 基于QMainWindow,生成菜单下面的工具栏,可以当作菜单功能的快捷键,也可以完成新的功能 直接在UI文件中…...
【Linux内核】从0开始入门Linux Kernel源码
🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[Linux内核] ❤️ 前置学习专栏:[Linux学习]从0到1 ⏰ 我们仍在旅途 目录 …...
SQL Service 2008 的安装与配置
点击添加当前用户...
Apache POI | Java操作Excel文件
目录 1、介绍 2、代码示例 2.1、将数据写入Excel文件 2.2、读取Excel文件中的数据 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步…...
vue 学习definproperty方法
definproperty方法是Vue很重要的一个底层方法,掌握他的原理很重要,下面通过代码说明问题: <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>回顾Object.defineproperty方法</title&…...
react 实现路由拦截
简单介绍下项目背景,我这里做了一个demo,前端使用mock数据,然后实现简单的路由拦截,校验session是否包含用户作为已登录的依据,react-router-dom是v6。不像vue可以设置登录拦截beforeenter,react需要我们自…...
数据分析(一) 理解数据
1. 描述性统计(summary) 对于一个新数据集,首先通过观察来熟悉它,可以打印数据相关信息来大致观察数据的常规特点,比如数据规模(行数列数)、数据类型、类别数量(变量数目、取值范围…...
什么是 Flet?
什么是 Flet? Flet 是一个框架,允许使用您喜欢的语言构建交互式多用户 Web、桌面和移动应用程序,而无需前端开发经验。 您可以使用基于 Google 的 Flutter 的 Flet 控件为程序构建 UI。Flet 不只是“包装”Flutter 小部件,而是…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
