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

故障诊断 | 基于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;做出更加明智的决策。 数据大屏的定义及作…

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;就是我们对…

SOLIDWORKS 2024:零件亮点的升级与突破

随着科技的不断发展&#xff0c;工程设计软件也在持续进步&#xff0c;以更好地满足工程师和设计师的需求。SOLIDWORKS&#xff0c;作为一款广泛使用的三维CAD软件&#xff0c;一直在不断地推出新版本&#xff0c;以提供更强大、更便捷的功能。今天&#xff0c;我们将深入探讨S…

初步研究Pose_300W_LP datasets.py

mat文件参数解读 Color_para&#xff1a;颜色参数&#xff0c;用于描述图像的颜色属性&#xff0c;比如图像的亮度、对比度等信息。 亮度属性、对比度属性、饱和度属性&#xff08;颜色越鲜艳&#xff09;、色调属性&#xff08;色调越偏向蓝色&#xff09;、色温属性&#xf…

【EI会议】第二届计算机、物联网与智慧城市国际会议

第二届计算机、物联网与智慧城市国际会议 快速通道 投稿链接&#xff1a;loading 截稿时间&#xff1a;9月15日 检索&#xff1a;EI检索 一、会议信息 大会官网&#xff1a;www.ciotsc.org 会议地点&#xff1a;湖南株洲 会议时间&#xff1a;2023年11月15日-17日 二、征稿主…

python读取xml列数据绘制3D散点图

python 读取excel 3d散点图 在Python中&#xff0c;要读取Excel文件并创建3D散点图&#xff0c;你可以使用pandas库来读取数据&#xff0c;然后使用matplotlib库来创建3D散点图。以下是一个简单的例子&#xff1a; 首先&#xff0c;确保安装了所需的库&#xff1a; pip inst…

基于扩散模型的,开源世界模型DIAMOND

日内瓦大学、微软研究院和爱丁堡大学的研究人员联合开源了&#xff0c;基于扩散模型的世界模型—DIAMOND。 研究人员之所以选择扩散模型作为基础&#xff0c;是因为可以更好地捕捉视觉细节&#xff0c;同时具有建模复杂多模态分布的能力&#xff0c;以便在不同的环境下进行训练…

vue3 手动简单 24h 甘特图封装

甘特图 手动封装简版甘特图&#xff0c;纯展示功能&#xff0c;无其他操作 文章目录 甘特图前言效果图组件使用总结 前言 开始的思路是使用echarts 瀑布图来体现&#xff0c;但是试验后发现&#xff0c;头部时间功能不满足&#xff0c;然未找到其他组件&#xff0c;于是手动封…

VTK实现三视图显示及交互STL模型

VTK实现STL模型的三视图显示及交互 最近收到需求&#xff0c;要实现多视图显示同一个STL模型&#xff0c;并且控制主窗口要其他试图窗口也跟着交互&#xff0c;花了点时间去尝试一下&#xff0c;把这个效果给实现出来了&#xff0c;而且实现也挺简单。 效果演示 要点 用同一个…

微火全域运营平台成优选,业内人士纷纷研究!

随着全域运营赛道的兴盛&#xff0c;越来越多的全域运营平台陆续上线&#xff0c;拓宽全域运营服务商选择空间的同时&#xff0c;也让全域运营平台选择成为了他们最为头疼的问题。在此背景下&#xff0c;各大全域运营平台背后的研发公司开始各出奇招&#xff0c;以获得更多全域…

EI期刊的定金和尾款

当涉及到EI&#xff08;工程索引&#xff09;期刊发表并支付定金和尾款时&#xff0c;许多学者和研究人员可能会感到担忧&#xff0c;因为这涉及到一定的风险。在探讨这个话题时&#xff0c;我们需要考虑几个因素&#xff0c;包括期刊的声誉、可信度、出版质量以及作者的权益保…

windows上安装miniforge和jupyterlab

1&#xff0c;下载miniforge3 GitHub - conda-forge/miniforge: A conda-forge distribution. 下载下来后傻瓜式安装就可以了 配置环境变量&#xff0c;在系统环境变量的path添加下列就行了&#xff0c;根据自己的路径修改 2&#xff0c;创建虚拟环境 conda create -n test …