当前位置: 首页 > news >正文

【C++初阶学习】第十二弹——stack和queue的介绍和使用

C语言栈:数据结构——栈(C语言版)-CSDN博客

C语言队列:数据结构——队列(C语言版)-CSDN博客

前言:

在之前学习C语言的时候,我们已经学习过栈与队列,并学习过如何使用C语言来实现栈与队列,今天,我们用C++来学习这些知识,让我们探索一下其中的新的知识点

目录

一、stack(栈)

1. 栈的概述

​编辑

2. 栈的构造函数和成员函数

3. 栈的使用示例

4. 注意事项

二、queue(队列)

1. 队列的概述

​编辑

2. 队列的构造函数和成员函数

3. 队列的使用示例

4. 注意事项

三、思考题

四、总结


一、stack(栈)

C++中的stack是一种遵循后进先出原则的容器适配器。它提供了一系列标准的操作,使得用户可以方便地实现栈这种数据结构。

1. 栈的概述

在C++标准库中,stack并不直接暴露给用户,而是作为<stack>头文件中stack模板类的声明。这个类是std::deque的封装,因此默认情况下,栈是通过双端队列实现的。但是,用户也可以指定其他的容器作为栈的底层结构,比如std::vectorstd::list

2. 栈的构造函数和成员函数

栈提供了以下构造函数成员函数,以便用户可以轻松地创建和使用栈:

  • 空栈构造函数:创建一个空的栈。
  • 基于容器的构造函数:使用一个已存在的容器来初始化栈。
  • 拷贝构造函数:创建一个新栈,其内容是另一个栈的副本。

成员函数包括:

  • empty():检查栈是否为空。
  • size():获取栈中的元素数量。
  • top():返回栈顶元素的引用。
  • push(const T&):在栈顶插入一个元素。
  • pop():移除并返回栈顶元素。
  • emplace(const T&):在栈顶位置构造并插入一个元素。
  • swap(stack&):与另一个栈交换元素。

3. 栈的使用示例

以下是一个简单的使用C++栈的示例代码:

#include <iostream>
#include <stack>int main() {std::stack<int> numbers;// 压入一些数字numbers.push(1);numbers.push(2);numbers.push(3);// 打印栈顶元素std::cout << "栈顶元素: " << numbers.top() << std::endl;// 弹出栈顶元素numbers.pop();// 检查栈是否为空if (numbers.empty()) {std::cout << "栈为空" << std::endl;} else {std::cout << "栈不为空,栈中有 " << numbers.size() << " 个元素" << std::endl;}return 0;
}

运行结果:

4. 注意事项

虽然栈的使用看似简单,但在实际应用中仍然需要注意以下几点:

  • 确保不要超过栈的容量,否则可能会导致溢出。
  • 如果你需要频繁地访问栈中的元素,而不是仅仅进行 push 和 pop 操作,可能需要考虑使用其他数据结构。
  • 在模拟实现栈时,要注意内存管理,避免内存泄漏。

二、queue(队列)

C++中的queue是一种遵循先进先出原则的容器适配器。它提供了一系列标准的操作,使得用户可以方便地实现队列这种数据结构。

1. 队列的概述

在C++标准库中,queue并不直接暴露给用户,而是作为<queue>头文件中queue模板类的声明。这个类是std::deque的封装,因此默认情况下,队列是通过双端队列实现的。但是,用户也可以指定其他的容器作为队列的底层结构,比如std::list

2. 队列的构造函数和成员函数

队列提供了以下构造函数和成员函数,以便用户可以轻松地创建和使用队列:

  • 空队列构造函数:创建一个空的队列。
  • 基于容器的构造函数:使用一个已存在的容器来初始化队列。
  • 拷贝构造函数:创建一个新队列,其内容是另一个队列的副本。

成员函数包括:

  • empty():检查队列是否为空。
  • size():获取队列中的元素数量。
  • front():返回队列的第一个元素的引用。
  • back():返回队列的最后一个元素的引用。
  • push(const T&):在队列的尾部插入一个元素。
  • pop():移除并返回队列的第一个元素。
  • emplace(const T&):在队列的尾部位置构造并插入一个元素。
  • swap(queue&):与另一个队列交换元素。

3. 队列的使用示例

以下是一个简单的使用C++队列的示例代码:

#include <iostream>
#include <queue>int main() {std::queue<int> numbers;// 插入一些数字numbers.push(1);numbers.push(2);numbers.push(3);// 打印队列的第一个元素std::cout << "队列的第一个元素: " << numbers.front() << std::endl;// 打印队列的最后一个元素std::cout << "队列的最后一个元素: " << numbers.back() << std::endl;// 弹出队列的第一个元素numbers.pop();// 检查队列是否为空if (numbers.empty()) {std::cout << "队列为空" << std::endl;} else {std::cout << "队列不为空,队列中有 " << numbers.size() << " 个元素" << std::endl;}return 0;
}

运行结果:

4. 注意事项

虽然队列的使用看似简单,但在实际应用中仍然需要注意以下几点:

  • 确保不要超过队列的容量,否则可能会导致溢出。
  • 如果你需要频繁地访问队列中的元素,而不是仅仅进行 push 和 pop 操作,可能需要考虑使用其他数据结构。
  • 在模拟实现队列时,要注意内存管理,避免内存泄漏。

三、思考题

1、我们学过如何用C语言来模拟实现栈与队列,那我们如今学习了C++STL部分,请思考我们如何用C++来模拟实现栈与队列

2、上面我们讲到这两个的底层容器都是dequeue,那什么是dequeue呢?

3、我们可不可以用其他容器,如vector、list来模拟实现栈与队列?

(这些问题可以先思考一下,我们下篇再讲)

四、总结

上面就是stack和queue的介绍和使用,由于之前有过C语言的学习,所以在使用上难度不大,难的主要体现在它的底层模拟构造上,这些我们将在下一篇进行讲解

感谢各位大佬观看,创作不易,还请各位大佬一键三连!!!

相关文章:

  • 群体优化算法---蜂群优化算法应用于数据挖掘
  • 基于uni-app的 年-月-日 时 时间日期范围控件
  • k8s牛客面经篇
  • 【Spring框架全系列】SpringBoot_3种配置文件_yml语法_多环境开发配置(详细)
  • Linux【工具 03】Telnet服务安装使用(安全性较差 非特殊情况尽量不要使用)
  • 24.面向对象六大原则
  • 【python深度学习】——tensor内部存储结构|内存优化与as_strided|内存紧凑化contiguous
  • 面试题:说说浏览器的缓存机制
  • WebSocket 断网重连、心跳检测功能封装
  • 极简网络用户手册(1)
  • 【代码随想录算法训练营第37期 第二十八天 | LeetCode93.复原IP地址、78.子集、90.子集II】
  • 算法简单笔记3
  • C语言:(动态内存管理)
  • 攻防世界maze做法(迷宫题)
  • appium元素定位工具_uiautomatorviewer.bat
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 30天自制操作系统-2
  • Android单元测试 - 几个重要问题
  • CAP 一致性协议及应用解析
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • SQLServer之创建显式事务
  • Sublime text 3 3103 注册码
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 机器学习学习笔记一
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用SAX解析XML
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # include “ “ 和 # include < >两者的区别
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (04)odoo视图操作
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (CPU/GPU)粒子继承贴图颜色发射
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (第一天)包装对象、作用域、创建对象
  • (二十四)Flask之flask-session组件
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (南京观海微电子)——COF介绍
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一) storm的集群安装与配置
  • (一)面试需要掌握的技巧
  • (转) ns2/nam与nam实现相关的文件
  • (转)Mysql的优化设置
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net framework profiles /.net framework 配置
  • .net 反编译_.net反编译的相关问题
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net 使用ajax控件后如何调用前端脚本