C++数据结构之:队Queue

摘要:

  it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。

  此系列专注讲解数据结构数组、链表、队列、栈、树、哈希表、图,通过介绍概念以及提及一些可能适用的场景,并以C++代码简易实现,多方面认识数据结构,最后为避免重复造轮子会浅提对应的STL容器。本文介绍的是队Queue。

(开发环境:VScode,C++17)

关键词C++数据结构队列Queue

声明:本文作者原创,转载请附上文章出处与本文链接。

文章目录

      • 摘要:
      • 正文:
        • 介绍:
          • 特性:
          • 应用:
        • 代码实现:
        • 对应STL:
      • 推荐阅读

正文:

介绍:

  队列(Queue)是一种常见的数据结构,它遵循先入先出(FIFO,First In First Out)的原则。队列中的元素按照它们进入队列的顺序排列,并且只有队首的元素可以被删除,队尾的元素可以被添加。

在这里插入图片描述

  队列也有两种存储表示方法:顺序存储(用数组实现)和链式存储(用链表实现),顺序存储常见的就是环形队列,初始化时必须指定队列容量大小;普通队列则基于链表。

特性:
  • 先进先出:队列的基本操作是遵循FIFO(先进先出)原则的。这意味着最早添加到队列中的元素将是最早被移除的。这种特性使得队列在处理需要按顺序处理的元素时非常有用,比如任务调度、打印作业等。

  • 受限的访问:队列只允许在两端进行操作。在队列的一端(称为“队尾”或“后端”)添加元素,而在另一端(称为“队头”或“前端”)移除元素。这种特性确保了队列中的元素按照它们被添加的顺序进行处理。

应用:

队列在多种场景中都有应用,包括:

  • 任务调度:在计算机系统中,多个任务可能同时请求CPU资源。使用队列可以确保任务按照它们到达的顺序得到处理。
  • 打印机作业队列:当一个用户提交一个打印作业时,它会被添加到打印队列中。打印机按照作业进入队列的顺序打印它们。
  • 网络数据包处理:在网络通信中,接收到的数据包需要按照它们到达的顺序进行处理。队列可以帮助管理这些数据包,确保它们按照正确的顺序被处理。
  • 图形界面事件处理:在图形用户界面(GUI)中,用户事件(如鼠标点击或键盘输入)被添加到事件队列中。事件处理程序按照事件进入队列的顺序处理它们。
代码实现:
#cqueue.h
#ifndef CQUEUE_H
#define CQUEUE_H
#include <iostream>
using namespace std;// 队链节点
template<class T>
class CQueueNode
{
public:CQueueNode(T t) :data(t), next(NULL) {}~CQueueNode() { next = NULL; }CQueueNode(const CQueueNode& node){if (this == &node){return;}*this = node;}CQueueNode& operator=(const CQueueNode& node){if (this == &node){return *this;}this->data = node.data;this->next = node.next;return *this;}public:T data;CQueueNode *next;
};// 普通队列实现,基于链表
template<class T>
class CQueue
{
public:CQueue() :head(NULL), tail(NULL), node(NULL), m_iSize(0) {}~CQueue(){delete head;head = NULL;delete tail;tail = NULL;delete node;node = NULL;}int size();                     // 获取队内成员个数 bool empty();                   // 判断是否为空队列void push(T t);                 // 队尾入队T pop();                        // 队首出队T front();                      // 返回队首T back();                       // 返回队尾void traverse();                // 打印整个队列private:CQueueNode<T>* head;CQueueNode<T>* tail;CQueueNode<T>* node;int m_iSize;
};template<class T>
int CQueue<T>::size()
{return m_iSize;
}template<class T>
bool CQueue<T>::empty()
{return 0 == m_iSize;
}template<class T>
void CQueue<T>::push(T t)
{node = new CQueueNode<T>(t);if (head == NULL){head = tail = node;}else{tail->next = node;tail = node;}m_iSize++;
}template<class T>
T CQueue<T>::pop()
{if (empty()){throw "empty queue.";}node = head;head = head->next;m_iSize--;return node->data;
}template<class T>
T CQueue<T>::front()
{if (empty()){throw "empty queue.";}return head->data;
}template<class T>
T CQueue<T>::back()
{if (empty()){throw "empty queue.";}return tail->data;
}template<class T>
void CQueue<T>::traverse()
{CQueueNode<T> *node = head;while (node != NULL){cout << node->data << " ";node = node->next;}cout << endl;
}#endif // !CQUEUE_H
#cqueue.cpp
#include "cqueue.h"
using namespace std;int main(int argc, char**argv)
{CQueue<char> queue;queue.push('h');queue.push('e');queue.push('l');queue.push('l');queue.push('o');queue.push(' ');queue.push('w');queue.push('o');queue.push('r');queue.push('l');queue.push('d');queue.traverse();cout << queue.front() << endl;cout << queue.back() << endl;char c = queue.pop();cout << c << endl;queue.traverse();return 0;
}

在这里插入图片描述

对应STL:
  • queue:

    普通队列。其原理是先进先出(FIFO),只有队头和队尾可以被访问,故不可有遍历行为,默认也为deque双端队列

  • deque:

    双端队列。支持头插、删,尾插、删,随机访问较vector容器来说慢,但对于首尾的数据操作比较方便

推荐阅读

C/C++专栏:https://blog.csdn.net/weixin_45068267/category_12268204.html
(内含其它数据结构及对应STL容器使用)

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

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

相关文章

嵌入式不一定只能用C!

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手动分割线-------------------------------------------------------------------------------- 本文章参考了以下文章&#xff1a; 这里是引用 ------------…

高级数据结构-树状数组

基本知识&#xff1a; 1.lowbit运算 int lowbit(int x){return x & -x; } 2.树状数组及其应用 a[N]是原始数组&#xff1b; c[N]是树状数组&#xff0c;存放数组a中i号位之前的lowbit(i)个元素之和&#xff0c;c[i]覆盖长度是lowbit(i) 特别强调 树状数组的下标必须从…

LIMS系统在建设行业中的应用

1、保证实验室检验检测业务效率及质量 通过系统对实验室实验业务流程进行管控&#xff0c;提高各个业务环节工作效率&#xff0c;对报表、记录、报告、各类文件实现电子化管理&#xff0c;避免了人工打印和传递&#xff0c;提高实验室检验检测工作业务水平。应用更先进的自动化…

现场辩论赛活动策划方案

活动目的&#xff1a; 技能竞赛中的辩论环节既可以考核员工的知识点&#xff0c;同时也可以考核员工业务办事能力&#xff0c;表达能力&#xff0c;是一种比较全面且较有深度的竞赛方式。 辩论赛细则&#xff1a; 1、时间提示 : 自由辩论阶段&#xff0c;每方使用时间剩…

springcloud项目部署Nginx+Gateway+其他服务

一. 部署 Nginx&#xff1a; Nginx 是一个高性能的 Web 服务器和反向代理服务器。它常用于将流量从公共互联网引导到内部的应用程序服务器。你可以在服务器上安装 Nginx&#xff0c;并根据你的需求进行配置。通常的配置包括监听端口、定义服务器块、配置反向代理、设置 SSL/TL…

中老年人交友市场的现状与趋势分析

随着社会的发展和人口老龄化的加剧&#xff0c;中老年人的社交需求日益增长&#xff0c;这为交友市场带来了新的机遇和挑战。本文将从中老年人的社交需求出发&#xff0c;对当前中老年人交友市场的现状、问题及未来发展趋势进行深入分析。 一、中老年人交友市场的现状 1. 市场…

华为云会议对接,华为云会议事件消息订阅

最近做了一个对接华为云视频会议接口&#xff0c;订阅华为云会议事件消息的功能。做之前在网上搜索了一番&#xff0c;居然发现没有一个这方面的资料。决定整理一下分享出来&#xff0c;留给有缘人 具体的需求是&#xff0c;我们的app上集成了华为云会议sdk&#xff0c;在用户开…

【CTF-Web】XXE学习笔记(附ctfshow例题)

XXE 文章目录 XXE0x01 前置知识汇总XMLDTD &#xff08;Document Type Definition&#xff09; 0x02 XXE0x03 XXE危害0x04 攻击方式1. 通过File协议读取文件Web373(有回显)Web374(无回显) Web375Web376Web377Web378 0x01 前置知识汇总 XML 可扩展标记语言&#xff08;eXtensi…

Android音频焦点

什么是音频焦点&#xff1f; 音频焦点是 API 8 中引入的一个概念。它用于传达这样一个事实&#xff1a;用户一次只能专注于一个音频流&#xff0c;例如收听音乐或播客&#xff0c;但不能同时关注两者。在某些情况下&#xff0c;多个音频流可以同时播放&#xff0c;但只有一个是…

2021职称继续教育--实行高水平对外开放,积极参与全球经济治理体系改革,开拓合作共赢新局面

单选题&#xff08;共7题&#xff0c;每题5分&#xff09; 1、根据本讲&#xff0c;我国目前已有&#xff08;&#xff09;个省份设立了自贸区。 C、21 2、根据本讲&#xff0c;“一带一路”的官方翻译为&#xff08;&#xff09;。 A、The Belt and Road Initiative 3、根据…

故障诊断 | 基于KAN故障诊断模型

效果一览 文章概述 故障诊断 | 基于 KAN故障诊断模型。KAN是一种全新的神经网络架构&#xff0c;它与传统的MLP架构不同&#xff0c;能够用更少的参数量在Science领域取得惊人的表现&#xff0c;并且具备可解释性&#xff0c;有望成为深度学习模型发展的一个重要方向。运用KAN&…

从0开始学web之信息收集

web1~源代码 web1:where is flag?直接右键源代码找到。 web2~源代码 无法查看源代码确实右键不了&#xff0c;F12用不了&#xff0c; 但是还可以在URL前加上view-source: web3~HTTP响应 web3:where is flag?右键源代码没有&#xff0c;那就看看HTTP 头&#xff0c;F12抓…

数据大屏方案 : 实现数据可视化的关键一环_光点科技

在数字时代的浪潮中&#xff0c;数据已经成为企业决策和操作的重要基础。因此&#xff0c;“数据大屏方案”逐渐成为业界关注的焦点。这类方案通过将复杂的数据集合以直观的形式展现出来&#xff0c;帮助决策者快速把握信息&#xff0c;做出更加明智的决策。 数据大屏的定义及作…

什么是银行虚拟户?

虚拟银行账户是一种不同于传统银行账户的银行服务形式。又称银行云账户&#xff0c;主要是一个结算账户&#xff0c;可以作为企业开立多个不同名称子账户的主账户。 这些子账户可以用于各种用途&#xff0c;包括企业核算、佣金支付等。&#xff0c;同时保证转账和报送的同音性…

机器学习-9-python中的pipeline以及sklearn中的pipeline

参考探秘Python的Pipeline魔法 参考sklearn之pipeline:pipeline函数/make_pipeline函数的简介及其区别联系、使用技巧、案例应用之详细攻略 参考Python函数式编程之pipeline——很酷有没有 1 什么是Pipeline? pipeline 管道借鉴于Unix Shell的管道操作——把若干个命令串起…

nginx 配置 gzip压缩及去除 html 缓存

server{listen 80;server_name test.exmaple.cn;gzip on; # 是否开启gzip# gzip_buffers 32 4K; # 缓冲(压缩在内存中缓冲几块? 每块多大?)gzip_comp_level 6; # 推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)gzip_min_length 1k; # 开始压缩的最小长度(再小就…

Java-数组内存解析

文章目录 1.内存的主要结构&#xff1a;栈、堆2.一维数组的内存解析3.二维数组的内存解析 1.内存的主要结构&#xff1a;栈、堆 2.一维数组的内存解析 举例1&#xff1a;基本使用 举例2&#xff1a;两个变量指向一个数组 3.二维数组的内存解析 举例1&#xff1a; 举例2&am…

java生产制造执行系统MES源码:系统环境:Java EE 8、Servlet 3.0、Apache Maven 3 2;

MES系统技术选型 系统环境&#xff1a;Java EE 8、Servlet 3.0、Apache Maven 3 2&#xff1b; 主框架&#xff1a;Spring Boot 2.2.x、Spring Framework 5.2.x、Spring Security 5.2.x 3 持久层&#xff1a;Apache MyBatis 3.5.x、Hibernate Validation 6.0.x、Alibaba Dru…

Ai绘画怎么正确使用关键词?

在AI绘画的过程中&#xff0c;关键词&#xff08;提示词&#xff09;是非常重要的组成部分&#xff0c;下面我以AI绘画常用的Stable Diffusion为例&#xff0c;来介绍下AI绘画怎么使用提示词吧&#xff01; 一、提示词是什么 提示词&#xff08;Prompt&#xff09;就是我们对…