C++中的常见数据结构 --- 队列、栈、列表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

队列、栈、列表

  • 前言
  • 一、队列(Queue)
  • 二、栈(Stack)
  • 三、列表(List)
  • 总结


前言

队列、栈、列表是其中三个最为基础和常用的数据结构,它们在编程的世界中被广泛应用,为算法和数据处理提供了不可或缺的支持。今天来简单的介绍一下!以及他们在C++中的简单用法!


一、队列(Queue)

队列是一种常见的数据结构,它按照先进先出(FIFO)的原则管理元素。队列通常用于在程序中保存和处理一系列任务或数据。

  • 入队(enqueue): 将元素添加到队列的末尾。
  • 出队(dequeue): 从队列的前端移除元素。

队列的特点是新元素总是在队列的尾部添加,而移除元素总是从队列的头部进行。队列是一个有序的集合,先进入队列的元素会先被处理

队列常常用于解决需要按顺序处理的问题,例如任务调度、广度优先搜索等。

C++标准库中 std::queue :

  • push: 将元素添加到队列的末尾
  • front: 访问队头元素
  • pop: 移除队头元素
  • empty: 检查队列是否为空

例子:

#include <iostream>
#include <queue>int main() {// 创建一个队列std::queue<int> myQueue;// 入队操作myQueue.push(1);  myQueue.push(2);// 出队操作while (!myQueue.empty()) {std::cout << myQueue.front() << " "; // 访问队头元素myQueue.pop(); // 出队}return 0;
}

二、栈(Stack)

栈是一种基本的数据结构,具有后进先出(LIFO)的特性。这意味着最后进入栈的元素将首先被移除。栈通常有两个主要操作:压入(Push)和弹出(Pop)。

  • 压入(Push): 将元素添加到栈的顶部。
  • 弹出(Pop): 从栈的顶部移除元素。

栈常常用于解决解密回文,函数调用,深度优先搜索(DFS),回溯算法,括号匹配,递归算法的非递归实现,迷宫求解,编辑器的撤销操作等等。

  • 函数调用: 栈被用来存储函数调用的上下文信息,包括局部变量、返回地址等。函数调用时,局部变量等信息被压入栈,函数执行完成后再从栈中弹出
  • 深度优先搜索(DFS): 在图的深度优先搜索算法中,栈可以用于追踪遍历路径。每次访问一个节点时,将其邻接节点压入栈,然后从栈中弹出下一个节点进行继续深度搜索
  • 回溯算法: 回溯算法通常使用栈来保存当前的状态,并在需要时回退到之前的状态,以搜索所有可能的解空间
    括号匹配: 栈可以用于检查表达式中的括号是否匹配,以及判断表达式的有效性
    递归算法的非递归实现: 栈可以用于模拟递归算法的工作方式,将递归调用转化为循环结构
  • 迷宫求解: 在迷宫求解问题中,栈可以用于保存当前路径,如果当前路径无法到达目标点,则回退到上一个路径
  • 编辑器的撤销操作: 栈可以用于实现编辑器中的撤销和重做操作,存储用户操作的历史记录

C++标准库中 std::stack:

  • push: 将元素压入栈顶
  • pop: 弹出栈顶元素
  • top(): 访问栈顶元素,但不弹出
  • empty(): 检查栈是否为空
  • size(): 返回栈中元素的数量
#include <iostream>
#include <stack>int main() {std::stack<int> myStack;// 压入元素myStack.push(1);myStack.push(2);// 弹出元素while (!myStack.empty()) {std::cout << myStack.top() << " "; // 访问栈顶元素myStack.pop(); // 弹出栈顶元素}return 0;
}

三、列表(List)

列表是一种有序可变的数据结构,用于存储一系列的元素。列表是一种非常灵活和常用的数据类型,它可以包含不同数据类型的元素,甚至可以包含其他列表。

C++标准库中 std::list:

  • push_back(): 在列表末尾插入元素
  • push_front(): 在列表开头插入元素
  • insert(): 在指定位置插入元素
  • remove(): 删除指定值的元素
  • pop_back(): 弹出并删除最后一个元素
  • front(): 访问第一个元素
  • back(): 访问最后一个元素
  • size(): 获取列表大小
  • clear(): 清空列表
  • empty(): 判断列表是否为空
  • for (auto it = myList.begin(); it != myList.end(); ++it): 使用迭代器遍历列表
#include <iostream>
#include <list>int main() {// 创建一个空列表std::list<int> myList;// 在列表末尾插入元素myList.push_back(1);myList.push_back(2);myList.push_back(3);// 在列表开头插入元素myList.push_front(0);std::cout << "List elements: ";// 使用迭代器遍历列表并打印元素for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}// 在指定位置插入元素auto insertPos = std::next(myList.begin(), 2);myList.insert(insertPos, 99);  myList.remove(2);// 删除指定值的元素    myList.pop_front();// 弹出并删除第一个元素myList.pop_back();// 弹出并删除最后一个元素// 访问第一个元素和最后一个元素std::cout << "First element: " << myList.front() << std::endl;std::cout << "Last element: " << myList.back() << std::endl;std::cout << "List size: " << myList.size() << std::endl; // 获取列表大小myList.clear();// 清空列表if (myList.empty()) {// 判断列表是否为空std::cout << "List is empty." << std::endl;}return 0;
}

总结

本节介绍了队列、栈、列表是其中三个最为基础和常用的数据结构,唐怡佳继续加油~

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

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

相关文章

stable diffusion代码学习笔记

前言&#xff1a;本文没有太多公式推理&#xff0c;只有一些简单的公式&#xff0c;以及公式和代码的对应关系。本文仅做个人学习笔记&#xff0c;如有理解错误的地方&#xff0c;请指出。 本文包含stable diffusion入门文献和不同版本的代码。 文献资源 本文学习的代码&…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)

Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&#xff08;2&#xff09; 在 https://zhangphil.blog.csdn.net/article/details/135374279 基础上&#xff0c;增加一个功能&#xff0c;当手指在上面的图片…

【DevOps-08-3】Jenkins容器内部使用Docker

一、简要描述 构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。 设置Jenkins容器使用宿主机Docker。 二、配置和操作步骤 1、修改宿主机docker.sock权限 # 修改docker.sock 用户和用户组都为root $ …

并发,并行,线程与UI操作

并行和并发是计算机领域中两个相关但不同的概念。 并行&#xff08;Parallel&#xff09;指的是同时执行多个任务或操作&#xff0c;它依赖于具有多个处理单元的系统。在并行计算中&#xff0c;任务被分成多个子任务&#xff0c;并且这些子任务可以同时在不同的处理单元上执行…

工智能基础知识总结--聚类算法

什么是聚类算法 聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方…

DEJA_VU3D - Cesium功能集 之 112-获取圆节点(1)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题二 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

探索“城堡世界”APP:你的城堡,你的故事

在快节奏的现代生活中&#xff0c;我们常常渴望有一个属于自己的世界&#xff0c;可以随心所欲地创造和讲述故事。今天&#xff0c;我们要为大家介绍的是一款名为“城堡世界”的APP&#xff0c;它将带给你实现这个梦想的机会。 “城堡世界”是一款独特的APP&#xff0c;它允许用…

vue-virtual-scroll-list(可单选、多选、搜索查询、创建条目)

element-ui-解决下拉框数据量过多问题&#xff08;vue-virtual-scroll-list&#xff09;_element-ui下拉框数据太多如何优化-CSDN博客 的升级版 参考链接&#xff1a;封装el-select&#xff0c;实现虚拟滚动,可单选、多选、搜索查询、创建条目-CSDN博客 1.封装组件 select.v…

redis获取过期时间

03&#xff0c;redisTemplate_redistemplate 获取剩余时间-CSDN博客 11.返回当前key所对应的剩余过期时间 redisTemplate.getExpire(key);1 12.返回剩余过期时间并且指定时间单位 redisTemplate.getExpire(key, unit);

深入理解区间合并:让数字之间的故事更加有序

嗨&#xff0c;亲爱的读者朋友们&#xff01;在今天的这篇博客中&#xff0c;我们将深入探讨一个在编程和算法中常见但又很有趣的话题——区间合并。这个话题可能让一些初学者感到头疼&#xff0c;但我会尽力通过生动的例子和简单的解释来让你对它有一个清晰的认识。 引子&…

HTTP 常见协议:选择正确的协议,提升用户体验(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Vulnhub-HACKSUDO: PROXIMACENTAURI渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、端口敲门三、web密码爆破四、getShell五、获取新用户六、提权 一、前言 由于在做靶机的时候&#xff0c;涉及到的渗透思路是非常的广泛&#xff0c;所以在写文章的时候都是挑重点来写&#xff0…

也谈人工智能——AI科普入门

文章目录 1. 科普入门人工智能的定义人工智能的类型 - 弱 AI 与强 AI人工智能、深度学习与机器学习人工智能的应用和使用场景语音识别计算机视觉客户服务建议引擎数据分析网络安全 行业应用人工智能发展史![img](https://img-blog.csdnimg.cn/img_convert/66aeaaeac6870f432fc4…

error: undefined reference to ‘cv::imread(std::__ndk1::basic_string<char

使用android studio编译项目时&#xff0c;由于用到了 cv::imread&#xff08;&#xff09;函数&#xff0c;编译时却报错找不到该函数的定义。 cv::imread一般是在highgui.hpp中定义&#xff0c;因此我加上了该头文件&#xff1a; #include “opencv2/highgui/highgui.hpp” 但…

webtim开源即时通讯平台第三版发布

webtim是Web开源通讯平台。服务器是 Tim 。前端使用tim的js客户端 timjs 调用tim服务器接口渲染页面。 webtim开发目的是通过界面来显式表达tim接口功能。tim是去中心化的分布式IM引擎。支持多种基础通讯模式&#xff0c;对端到端的数据流传输支持非常全面&#xff0c;几乎涵…

【信息安全】hydra爆破工具的使用方法

hydra简介 hydra又名九头蛇&#xff0c;与burp常规的爆破模块不同&#xff0c;hydra爆破的范围更加广泛&#xff0c;可以爆破远程桌面连接&#xff0c;数据库这类的密码。他在kali系统中自带。 参数说明 -l 指定用户名 -L 指定用户名字典文件 -p 指定密码 -P 指…

Java十大经典算法—KMP

字符串匹配问题&#xff1a; 1.暴力匹配 public class ViolenceMatch {public static void main(String[] args) {String str1 "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";String str2 "尚硅谷你尚硅你好";int index violenceMatch(str1, str2);S…

力扣_数组29—根据前序与中序遍历序列构建二叉树、根据中序与后序遍历序列构建二叉树

题目 给定两个整数数组 p r e o r d e r preorder preorder 和 i n o r d e r inorder inorder &#xff0c;其中 p r e o r d e r preorder preorder 是二叉树的先序遍历&#xff0c; i n o r d e r inorder inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回…

数模学习day11-系统聚类法

本文参考辽宁石油化工大学于晶贤教授的演示文档聚类分析之系统聚类法及其SPSS实现。 目录 1.样品与样品间的距离 2.指标和指标间的“距离” 相关系数 夹角余弦 3.类与类间的距离 &#xff08;1&#xff09;类间距离 &#xff08;2&#xff09;类间距离定义方式 1.最短…