C++数据结构之:队Queue

news2024/11/16 11:36:26

摘要:

  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.coloradmin.cn/o/1713986.html

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

相关文章

STL库--priority_queue

目录 priority_queue定义 prority_queue容器内元素的访问 priority_queue()常用函数实例解析 priority_queue内元素优先级的设置 priority_queue的常见用途 priority_queue又称为优先队列&#xff0c;其底层是用堆来进行实现的。在优先队列中&#xff0c;队首元素一定是当…

【软件测试】LoadRunner参数化属性设置_单个参数

目录 为什么使用参数化属性详解Select next rowSequential&#xff08;顺序&#xff09;Random&#xff08;随机&#xff09;Unique&#xff08;唯一&#xff09;Same line as XXX&#xff08;和XXX属性的取值方式一样&#xff09; Update value onEach iteration&#xff08;每…

用于脑肿瘤分割的跨模态深度特征学习| 文献速递-深度学习肿瘤自动分割

Title 题目 Cross-modality deep feature learning for brain tumor segmentation 用于脑肿瘤分割的跨模态深度特征学习 01 文献速递介绍 作为最致命的流行病&#xff0c;脑肿瘤的研究越来越受到关注。本文研究了一种基于深度学习的自动分割胶质瘤的方法&#xff0c;称为脑…

百度ERNIE系列预训练语言模型浅析(4)-总结篇

总结&#xff1a;ERNIE 3.0与ERNIE 2.0比较 &#xff08;1&#xff09;相同点&#xff1a; 采用连续学习 采用了多个语义层级的预训练任务 &#xff08;2&#xff09;不同点&#xff1a; ERNIE 3.0 Transformer-XL Encoder(自回归自编码), ERNIE 2.0 Transformer Encode…

vue3学习(二)

前言 上一篇分享了vue的基础指令&#xff0c;这篇记录下vue3的核心内容&#xff0c;也是自己的学习笔记&#xff0c;可能有些核心还不全&#xff0c;大佬请略过。 一、核心内容 分享这个之前&#xff0c;先声明下&#xff0c;我这里是用的脚手架的写法&#xff0c;分享的讲解截…

什么是数字化采购?一文解析!

在快速发展的数字经济时代&#xff0c;越来越多的企业开始想要了解什么是数字化采购&#xff1f;因为数字化采购已经成为提升效率、降低成本的关键举措。简单来说&#xff0c;采购数字化就是利用先进的数字化技术和工具&#xff0c;对传统的采购流程进行改造和优化&#xff0c;…

如何降本增效获得目标客户?AI企业使用联盟营销这个方法就对了!

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 为什么AI企业难以获客呢&#xff1f; 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功…

MQ第②讲~保证消息可靠性

前言 上一讲我们讲了MQ实际工作中常见的应用场景&#xff0c;这一节讲一下消息的可靠性&#xff0c;如果对MQ掌握程度比较高的铁子&#xff0c;可以不用看&#xff0c;节省您宝贵的时间。 消息的大致链路 消息从投递到消费需要考虑如下几个问题 生产者的消息是否成功投递到消…

mac安装的VMware虚拟机进行桥接模式配置

1、先进行网络适配器选择&#xff0c;选择桥接模式 2、点击网络适配器 设置... 3、选择WiFi&#xff08;我使用的是WiFi&#xff0c;所以选择这个&#xff09;&#xff0c;注意看右边的信息&#xff1a;IP和子网掩码&#xff0c;后续配置虚拟机的ifcfg-ens文件会用到 4、编辑if…

HarmonyOS-9(stage模式)

配置文件 {"module": {"requestPermissions": [ //权限{"name": "ohos.permission.EXECUTE_INSIGHT_INTENT"}],"name": "entry", //模块的名称"type": "entry", //模块类型 :ability类型和…

小迪和小捷的太空之旅——海底观光篇

书接上回&#xff0c;小迪和小捷来到了美丽的海底世界~

第三方软件测试机构进行验收测试的好处分享,需多少时间和费用?

在软件开发过程中&#xff0c;软件验收测试是不可或缺的一环。那么&#xff0c;什么是软件验收测试呢?为什么建议选择第三方软件测试机构进行验收测试呢? 软件验收测试是指在软件开发完毕后&#xff0c;由测试人员基于软件需求规格说明书和软件设计文档等材料&#xff0c;对…

【深度学习】吸烟行为检测软件系统

往期文章列表&#xff1a; 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示【深度学习】行人跌倒行为检测软件系统【深度学习】火灾检测软件系统【深度学…

AcWing 1600:完全二叉树

【题目来源】https://www.acwing.com/problem/content/1602/【题目描述】 给定一个树&#xff0c;请你判断它是否是完全二叉树。【输入格式】 第一行包含整数 N&#xff0c;表示树的结点个数。 树的结点编号为 0∼N−1。 接下来 N 行&#xff0c;每行对应一个结点&#xff0c;并…

查看和修改自己的git提交时的作者信息

首先查看自己本地配置的信息:git config --list 修改姓名和邮箱: 配置用户名 git config --global user.name "真实姓名" 配置邮箱 git config --global user.email "公司分配的企业邮箱" 示例 git config --global user.name "张三" git…

linux网络项目——基于WebServer的工业数据采集项目

一、项目目标和框图 项目目标&#xff1a;实现通过网页控制信息采集和通过网页控制灯泡和蜂鸣器的亮灭 二、项目分析 1.服务器源码分析 初始化服务器循环等待连接&#xff0c;连接后创建线程&#xff0c;调用线程函数msg_request&#xff0c;在函数中调用handler_msg函数分析…

AI大模型探索之路-实战篇10:数据预处理的艺术:构建Agent智能数据分析平台的基础

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

Web开发中,就session和cookie相比,用session比用cookie的优点有哪些?

在Web项目中&#xff0c;session和cookie都是用于存储用户数据的机制&#xff0c;但它们有不同的优缺点。使用session比使用cookie有以下几个主要优点&#xff1a; 1. 安全性更高 敏感数据保护&#xff1a;Session数据存储在服务器端&#xff0c;而不是客户端。这样&#xff…

什么叫USDT(泰达币)的前世今生!

一、引言 在数字货币的世界里&#xff0c;USDT&#xff08;Tether USDT&#xff09;以其独特的稳定机制&#xff0c;成为了连接传统金融市场与加密货币市场的桥梁。本文将带您了解USDT的诞生背景、发展历程、技术特点以及未来展望。 二、USDT的诞生背景 USDT是Tether公司推出…

QT::QNetworkReply类readAll()读取不到数据的可能原因

程序中&#xff0c;当发送请求时&#xff0c;并没有加锁&#xff0c;而是在响应函数中加了锁&#xff0c;导致可能某个请求的finished信号影响到其他请求响应数据的读取 connect(reply,&QNetworkReply::finished,this,&Display::replyFinished);参考这篇文章&#xff…