C++——栈和队列容器

news2024/11/24 17:40:33

前言:这篇文章我们将栈和队列两个容器放在一起进行分享,因为这两个要分享的知识较少,而且两者在结构上有很多相似之处,比如栈只能在栈顶操作,队列只能在队头和队尾操作。

不同于前边所分享的三种容器,这篇文章要介绍的两个容器,不再是单纯的空间创建存储,而是以vector、list等容器为底层来实现的容器。 


目录

一.栈

1.栈的框架

 2.功能实现

二.队列

1.队列框架

2.功能实现

三.扩展

总结


一.栈

栈的关键在于只能从栈顶进行入栈和出栈,那么我们就可以将vector或者list的头作为栈底,在尾进行操作


1.栈的框架

在数据结构的学习中我们已经知道,栈有顺序栈和链式栈两种,所以容器栈就可以按照需求,通过模板来选择是创建顺序栈还是链式栈

#include<vector>
#include<list>

namespace Mystack
{
	//stack<int vector<int>> 顺序栈
	//stack<int list<int>> 链式栈
	template<class T, class Container = vector<T>>
	class stack
	{
	public:

	private:
		Container _con;
	};
}

想要这样创建栈,就必须包含vector和list两个容器的头文件。 

通过使用两个模板参数,一个代表数据类型,一个代表栈的类型Container即英文"容器"

因为通常情况下所使用的栈都是顺序栈,所以我们为了方便栈的创建,可以将模板也写成缺省模板。缺省模板和缺省函数类似。 


 2.功能实现

我们直接来看:

		//入栈
		void push(const T& x)
		{
			_con.push_back(x);
		}
		//出栈
		void pop()
		{
			_con.pop_back();
		}
		//数据个数
		size_t size()
		{
			return _con.size();
		}
		//判空
		bool empty()
		{
			return _con.empty();
		}
		//栈顶元素
		const T& top()
		{
			return _con.back();
		}

因为栈的底层是另外两种容器之一,所以我们可以直接去调用它们的成员函数来实现我们的成员函数入栈就是尾插,出栈即是尾删、依次类推。 

测试如下:


二.队列

队列不同于栈,队列是在队尾插入元素,在队头删除元素。但是我们知道,vector并不支持头部的插入删除操作,因为这样的效率很低,所以我们只推荐使用list来作为队列的底层


1.队列框架

	template<class T, class Container = list<T>>
    class queue
	{
	public:

	private:
		Container _con;
	};

2.功能实现

		//入队
		void push(const T& x)
		{
			_con.push_back(x);
		}
		//出队
		void pop()
		{
			_con.pop_front();
		}
		//队尾元素
		T& back()
		{
			return _con.back();
		}
		const T& back()const
		{
			return _con.back();
		}
		//队头元素
		T& front()
		{
			return _con.front();
		}
		const T& front()const
		{
			return _con.front();
		}
		//数据个数
		size_t size()const
		{
			return _con.size();
		}
		//判空
		bool empty()const
		{
			return _con.empty();
		}

仍然是调用list的成员函数来实现queue的成员函数,测试如下:

 


三.扩展

除了vector、list之外,还有一种容器可以作为队列的底层——deque

 deque的底层是由多个长度相同的数组组成,而这些数组则由一个指针数组来管理

deque能够同时支持下标随机访问和头尾的插入删除,所以除了队列之外,在C++的底层,栈和队列实际上都是由deque来实现的

 

这里我们不对deque进行展开讲解,仅供小伙伴们了解。 


总结

stack和queue的使用和模拟实现都非常简单,也算是为前边学习的复杂模拟的一点小放松。

喜欢本篇文章的小伙伴记得一键三连,我们下期再见!

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

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

相关文章

设计模式-结构型-装饰器模式-decorator

发票基本类 public class Invoice {public void printInvoice() {System.out.println("打印发票正文");} } 发票正文类 public class Decorator extends Invoice {protected Invoice ticket;public Decorator(Invoice ticket) {this.ticket ticket;}Overridepubl…

WebKit是什么?

WebKit是一个开源的浏览器引擎&#xff0c;它用于呈现网页内容在许多现代浏览器中&#xff0c;包括Safari浏览器、iOS内置浏览器、以及一些其他浏览器如Google Chrome的早期版本。以下是一些关于WebKit的重要信息&#xff1a; 起源和发展&#xff1a;WebKit最初是由苹果公司为其…

P8707 [蓝桥杯 2020 省 AB1] 走方格

原题链接&#xff1a;[蓝桥杯 2020 省 AB1] 走方格 - 洛谷 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 2.思路分析 题目大意&#xff1a;现在有个人站在第 1 行第 1 列&#xff0c;要走到第 i 行第 j 列&#xff08;每次只能向右或者向下走&#xff09;&#xff0…

异常的种类

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 Oracle 运行时错误可以分为 Oracle 错误和用户自定义错误&#xff0c;与此对应&#xff0c;根据异常产生的机制和原理&#xff0c;可将 Oracle 的系统异常分为 3 种 预定义…

TiDB 组件 GC 原理及常见问题

本文详细介绍了 TiDB 的 Garbage Collection&#xff08;GC&#xff09;机制及其在 TiDB 组件中的实现原理和常见问题排查方法。 TiDB 底层使用单机存储引擎 RocksDB&#xff0c;并通过 MVCC 机制&#xff0c;基于 RocksDB 实现了分布式存储引擎 TiKV&#xff0c;以支持高可用分…

【RAG实践】基于LlamaIndex和Qwen1.5搭建基于本地知识库的问答机器人

什么是 RAG LLM 会产生误导性的 “幻觉”&#xff0c;依赖的信息可能过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented…

Pillow教程09:图片格式(png,jpg,ico等)批量转换+批量修改图片尺寸

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

场景文本检测识别学习 day02(AlexNet论文阅读、ResNet论文精读)

怎么读论文 在第一遍阅读的时候&#xff0c;只需要看题目&#xff0c;摘要和结论&#xff0c;先看题目是不是跟我的方向有关&#xff0c;看摘要是不是用到了我感兴趣的方法&#xff0c;看结论他是怎么解决摘要中提出的问题&#xff0c;或者怎么实现摘要中的方法&#xff0c;然…

华为机试题

目录 第一章、HJ1计算字符串最后一个单词的长度&#xff0c;单词以空格隔开。1.1&#xff09;描述1.2&#xff09;解题第二章、算法题HJ2 计算某字符出现次数1.1&#xff09;题目描述1.2&#xff09;解题思路与答案第三章、算法题HJ3 明明的随机数1.1&#xff09;题目描述1.2&a…

C++——优先级队列

前言&#xff1a;这篇文章我们继续来分享一个c的容器——优先级队列。 一.理解优先级 何为优先级一说&#xff1f;实际上就是有顺序的意思。 优先级队列&#xff0c;即有顺序的队列&#xff0c;是一个无需我们自己进行排序操作&#xff0c;在数据传入时就会由容器自己排好序的…

Linux系统安装内网穿透实现固定公网地址访问本地MinIO服务

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&am…

【蓝桥杯嵌入式】定时器的PWM输出与输入捕获(测量频率与占空比)

【蓝桥杯嵌入式】定时器的PWM输出与脉冲输 入捕获&#xff08;测量频率与占空比&#xff09; PWM输出cubemx配置程序设计 输入捕获cubemx配置程序设计 真题典例分析 PWM输出 cubemx配置 PWM输出引脚配置&#xff0c;这里使用PA6和PA7引脚输出两路PWM信号&#xff0c;分别对应的…

计算机提示msvcp140.dll丢失的解决方法

在日常操作与深度应用计算机系统的过程中&#xff0c;我们难免会遭遇各类技术性问题。其中&#xff0c;一种颇为常见且可能导致应用程序无法正常启动或运行的情况便是“msvcp140.dll文件缺失”。这一现象&#xff0c;对于无论是经验丰富的IT专业人士&#xff0c;还是对计算机知…

Linux操作系统(六):文件系统组件

参考资料&#xff1a;阿秀的笔记 文件系统 1. 文件系统的基本组成2. 文件的使用3.文件如何存储3.1 目录怎么存储 4.Linux继承于Unix系统的Unix文件实现方式4.1 Linux Ext 2/3 文件系统4.2 Linux Ext 4 文件系统4.3 磁盘空闲空间的管理机制4.3.1 空闲表法4.3.2 空闲链表法4.3.3…

网易云歌曲评论抓取

网易云歌曲评论爬取 步骤1.找到一首歌曲2.按下F12键打开开发者模式,对其进行抓包3.查找获得评论数据的接口4.对获得评论数据接口进行分析5.构建加密函数方法一方法二运行结果全部代码使用Js文件只使用python新的代码小结与展望这次的任务是获取网易云音乐下面的评论,涉及的知…

安卓四大组件——Service篇

1.作用 长时间位于后台&#xff08;无界面&#xff09;完成用户指定操作 1.1两类状态 &#xff08;a&#xff09;started&#xff08;启动&#xff09;&#xff1a;当应用程序组件&#xff08;如activity&#xff09;调用startService()方法启动服务时&#xff0c;服务处于sta…

HJ1 字符串最后一个单词的长度(字符串,import java.util.HashSet;)

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int num sc.nextInt();boolean[] in new boolean[…

设计模式学习笔记 - 设计模式与范式 -行为型:8.状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

概述 本章学习状态模式。在实际的开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上看&#xff0c;它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工…

✌2024/4/3—力扣—整数反转

代码实现&#xff1a; int reverse(int x) {long num 0;while (x ! 0) {num num * 10 x % 10;x x / 10;}if ((int)num ! num) {return 0;}return (int)num; }

使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…