队列的简介与C++模板实现

用C++队列模板实现杨辉三角的输出 如何用C++实现杨辉三角的输出,首先我们来分析杨辉三角的数学规律: 1、每行的第一和最后一个数都为1; 2、除去前两行,每个数是其上一行对应位置的两个数之和 我们把规律2推广,即在每一行的前排采用补0的方法,使第二行开始的每个数都是上一行对应位置两个数的和 利用规律2,我们知道可以用上一行的元素求出下一行的元素,在这里我们选择队列的方式,用队列保存上一行元素,来求本行元素 使用过的数在队 阅读详情

何为队列?

队列(Queue)也是一种线性存储结构,它具有如下特点:

队列中的数据元素遵守“先进先出”(First In First Out)的原则,简称FIFO结构。
在队尾添加元素,在对首删除元素。

队列的相关概念与操作

1.对头与队尾:允许元素插入的一端称为队尾,允许删除元素的一端称为对首。
2.入队:队列的插入操作。
3.出队:队列的删除操作。
4.求队列的大小
5.求对首元素的值
6.判断队列是否为空


栈是一种线性结构,能以数组或链表作为底层数据结构来实现。

基于数组的队列实现

以数组做为底层数据结构时,一般将队列实现为循环队列。这是因为:
1.如果采用顺序存储,每次从数组头部删除元素后,其后的元素都要依次往前移一个位置,时间复杂度为O(n);
2.对于上述问题,有人提议将对首标志往后移就不用移动元素了,可是这回造成空间的浪费。
所以为了实现队列的插入删除都是O(1)的时间复杂度,同时不造成空间的流失,我们采用循环队列。

何为循环队列?
即把数组看成一个首尾相连的圆环,删除元素时将队首标志往后移动,添加元素时若数组尾部已经没有空间,则考虑数组头部的空间是否空闲,如果是,则在数组头部进行插入。

这里写图片描述

如上图所示,我们以begin和end分别代表队首和队尾标志,end后面还有一个空位但是我们不存储元素,那么如何判断队满或者队空呢?
1.当begin==end时,表示队空。
2.当(end+1)%maxsize==begin时,表示队满。

/*队列的抽象数据类型*/
template <typename T>
class ArrayQueue
{
public:
    //构造函数
    ArrayQueue(int s): maxsize(s),begin(0),end(0),array(NULL) {
        array = new T[maxsize];
    }
    //析构函数
    ~ArrayQueue()
    {
        delete []array;
    }


    T front();          //对首元素
    bool pop();         //出对
    bool push(T t);     //入队
    bool isEmpty();     //判空
    int size();         //队列的大小
private:
    int begin;      //对首元素
    int end;        //对尾
    T *array;       //数组
    int maxsize;    //容量
};
具体实现
template <typename T>
T ArrayQueue<T>::front()
{
    if(begin != end)
        return array[begin];
};

template <typename T>
bool ArrayQueue<T>::pop()
{
    if(begin == end)
        return false;
    begin = (begin+1)%maxsize;
    return true;
};

template <typename T>
bool ArrayQueue<T>::push(T t)
{
    if((end+1)%maxsize == begin)
        return false;
    array[end] = t;
    end = (end+1) % maxsize;
    return true;
};

template <typename T>
bool ArrayQueue<T>::isEmpty()
{
    if(begin == end)
        return true;
    else
        return false;
};

template <typename T>
int ArrayQueue<T>::size()
{
    return (end - begin + maxsize) % maxsize;
};
主函数
int main()
{
    ArrayQueue<string> queue(6);
    queue.push("one");
    queue.push("two");
    queue.push("three");
    queue.push("four");
    queue.push("five");

    cout << "队列长度:" << queue.size() << endl;

    while(!queue.isEmpty())
    {
        cout << queue.front() << endl;
        queue.pop();
    }
    return 0;
}

输出结果:

这里写图片描述


基于链表的栈实现

基于链表的队列不存在上述问题,我们只需考虑哪头做队首,哪头做队尾。如下图所示,很清晰直观,不再啰嗦。

这里写图片描述

链表结点
/*链表结点,即队列中的元素*/
template <typename T>
struct Node
{
    Node(T t):value(t),next(NULL) {}
    Node() = default;
public:
    T value;        //队列中元素的值
    Node<T>* next;  //链表节点指针
};
队列的抽象数据类型
/*基于链表的队列的ADT*/
template <typename T>
class LinkQueue
{
public:
    LinkQueue(): phead(NULL),pend(NULL),count(0){
        phead = new Node<T>();
        pend = phead;
        count = 0;
    }

    T front();          //对首元素
    bool pop();         //出对
    bool push(T t);     //入队
    bool isEmpty();     //判空
    int size();         //队列的大小
private:
    Node<T>* phead;
    Node<T>* pend;
    int count;    //队列元素的数量
};
具体实现
template <typename T>
T LinkQueue<T>::front()
{
    if(count != 0)
        return phead->next->value;
};

template <typename T>
bool LinkQueue<T>::pop()
{
    if(count == 0)
        return false;
    Node<T>* pdel = phead-> next;
    phead -> next = pdel -> next;
    delete pdel;
    count--;
    return true;
};

template <typename T>
bool LinkQueue<T>::push(T t)
{
    Node<T>* pnode = new Node<T>(t);
    pend -> next = pnode;
    pend = pnode;
    count++;
    return true;
};

template <typename T>
bool LinkQueue<T>::isEmpty()
{
    if(count == 0)
        return true;
    else
        return false;
};

template <typename T>
int LinkQueue<T>::size()
{
    return count;
};
主函数实例
int main()
{
    LinkQueue<string> lqueue;
    lqueue.push("one");
    lqueue.push("two");
    lqueue.push("three");
    lqueue.push("four");
    lqueue.push("five");

    cout << "队列长度:" << lqueue.size() << endl;

    while(!lqueue.isEmpty())
    {
        cout << lqueue.front() << endl;
        lqueue.pop();
    }
    return 0;
}
输出结果:

这里写图片描述

  用C++模板实现基于数组和链表的队列,和上节实现栈相似,希望对大家有所帮助。

C++链队列的模板实现 C++链队列的模板实现 #pragma once //链队列的实现 #include <iostream> using namespace std; template<typename DataType> struct Node { DataType data; Node<DataType>* next; }; template<typename... 阅读详情

相关推荐

C++队列模板实现

逻辑 队列一种先进先出的数据结构 只能在一端进行插入,在另一端进行删除 代码 template <typename T> class Queue { private: class Node { public: T item; Node* next; Node(){} Node(T item, Node* next) { this->item = item;

mxy568767179的博客 893

C++ queue类成员介绍

queue(队列)是一种数据结构,它可以在一端插入元素,另一端弹出元素,并且按照元素被放入队列的顺序进行访问。在队列中插入元素的一端叫做队尾(rear),从队列中弹出元素的一端叫做队首(front)。队列的典型应用包括广度优先搜索和缓存。在C++ STL中,队列实现为一个模板类,称为queue。它包含以下操作:📖1.push(x):将元素x插入队列尾部。📖2.pop():弹出队列头部元素。📖3.front():返回队列头部元素。📖4.back()

fckbb的博客 1918

队列类模板【C++模板类应用之一】

队列类模板1 队列(Queue)特点2 队列中常用的操作3 队列类模板的设计与代码实现3.1 队列类模板的设计3.2 队列类模板的实现3.3 队列类模板的使用举例 1 队列(Queue)特点     队列(Queue)是一种先进先出的数据结构,例如:日常生活中在食堂排队打饭,每个后到的人都要排到队伍的最后边,而队伍最前面的人最先打到饭离开队伍。     因此,队列总是从队尾加入元素,而从队首移除元素,满足先进先出的规则。一般来说

席木木的博客 2711

C++实现消息队列模板类

C++实现消息队列模板类,线程安全

aerbeisishan2008的博客 281

C++模板FIFO队列实现练习

FIFO队列是一种先进先出的数据结构,它遵循”先到先服务”的原则,广泛应用于任务调度、缓冲处理等场景。FIFO队列确保了数据的处理顺序与到达顺序一致,是操作系统和编程领域中不可或缺的基本概念。模板类是C++中用于实现泛型编程的关键特性之一,它允许程序员编写与数据类型无关的代码。这意味着,同一套代码可以处理不同类型的数据,而无需为每种数据类型重复编写函数或类。在C++中,模板类的定义以关键字template开始,后跟一个或多个模板参数。

weixin_33610780的博客 354

C++中链表实现的队列模板类

链表中的节点通常由键值对组成,其中键用于存储数据,值指向下一个节点的地址。这种数据结构的特点是动态内存分配,即在运行时根据需要增加或删除节点,而不必事先知道数据的大小。队列是一种先进先出(First-In-First-Out,简称FIFO)的数据结构,它有两个主要的操作:入队(enqueue)和出队(dequeue)。新元素总是被添加到队列的末尾,而元素的移除总是从队列的前端开始。队列的这种特性使得它特别适合用于处理按顺序到达的请求。队列模板类的声明包括类名、构造函数、析构函数以及成员函数的声明。

weixin_33812391的博客 870

队列类模板简易版

队列类模板简易版

计算机视觉爱好者 750

构建C++模板类库:队列、栈与排序算法

在C++中,模板是实现代码重用和泛型编程的重要机制。它允许开发者编写与数据类型无关的代码,从而创建可处理不同类型数据的通用函数和类。模板分为函数模板和类模板,它们通过参数化类型或值来实现代码的复用。树是一种被广泛应用于计算机科学的数据结构,它模拟了一种层级关系,类似于现实世界中的家谱树或组织结构图。在树状数据结构中,每个元素被称为节点,每个节点可以有零个或多个子节点。树的根节点是唯一的,没有父节点,而叶节点是没有子节点的节点。在诸多树的变体中,二叉树由于其简洁性和易于操作的特性而被广泛使用。

weixin_35871529的博客 864

56.C++队列模版

#pragma once //Queue.h #ifndef QUEUE_H #define QUEUE_H #include<assert.h> //类模板的定义 template<class T,int SIZE=50> class Queue { private: int front, rear, count;//队头指针,队尾指针,元素个数 T list[SIZE];//队列元素数组 public: Queue();//构造函数,初始化队头指针,队尾指针,元素个数 .

GOOD LUCK 226

(一)ANSYS WORKBENCH实践入门

ANSYS-workbench 有限元分析应用基础教程 (张晔)学习笔记

qq_51767372的博客 1万+

密码子偏好性分析实战指南:从codonW到EMBOSS-CUSP的完整流程解析

本文详细解析了密码子偏好性分析的完整流程,从基础概念到实战操作,涵盖codonW和EMBOSS-CUSP工具的使用技巧。通过RSCU、ENC、CAI等关键参数分析,帮助研究者理解基因表达调控规律,优化外源基因表达效率,适用于分子生物学和合成生物学研究。

weixin_33737774的博客 571

C/C++算法编程竞赛标准模板库(STL)篇:队列(queue)

C/C++算法编程竞赛标准模板库(STL)篇:队列(queue) ,这章非常非常重要!!!

ConquerObstacles的博客 1198

计量经济学(因果关系探究-空间双重差分模型: 破解空间溢出效应的因果分析工具)

本文介绍了传统双重差分(DID)模型及其局限性,重点阐述了空间DID模型的必要性。传统DID通过组间差分分离干预效应,但无法处理空间溢出效应。空间DID模型引入空间计量方法,包括三种类型:空间自回归模型(SDID-SAR)捕捉因变量溢出,空间误差模型(SDID-SEM)处理残差相关性,空间杜宾模型(SDID-SDM)同时考虑因变量和自变量的空间滞后。模型选择需结合空间相关性检验,适用于环境政策、房地产限购等存在空间交互效应的研究场景。

YBAdvanceFu的博客 2030

C++模板实现队列

我准备练习一下模板的知识,然后自己实现vector类。在这之前,先用模板实现一个队列来热身吧。队列的底层是链表。主要是熟悉一下模板的写法。 另外,就是模板的定义和实现都要写在一个文件中(export关键字可以避免这样。还没用过),所以倒数第二行我加了个# include "qu

randyjiawenjie的专栏 5122

MAX30102心率血样模块在STM32F103芯片的程序说明

我希望你已经安装好了Keil MDK5这个软件,也安装了M3内核,可以编译一些STM32F103的一些项目下载程序后步骤: 1-按照下图找到IIC.uvprojx并打开(途中唯一绿色那个图标) 2-编译一次 3-确保0错误,0警告,下图所示 4-点击目标选项,然后找到STM32F103C8,再点debug–CMSIS****(我实际用的JTAG,用不了,选择这个CMSIS****即可)下图所示 5-下图所示,看看你的串口找到了没,找到了就点左下角的OK 6-按图上传到开发板 7-MAX30102接线方法

weixin_51357422的博客 5801

机械式激光雷达实现原理以及特性总结

本文介绍了机械式激光雷达的技术原理和核心特性。该技术通过机械旋转结构实现360°三维扫描,采用飞行时间法测距并生成点云数据。核心优势包括全向扫描、长距高精度和成熟度高,但存在体积大、成本高、可靠性受限等局限。典型应用于自动驾驶测试车、测绘建模等领域。与固态激光雷达相比,机械式在视场角和探测距离方面有优势,但在体积、成本和可靠性方面处于劣势。该技术目前主要应用于对成本不敏感的专业场景。

start_up_go的博客 262

【C++】STL:栈和队列模拟实现

C++中的stack(栈)和queue(队列)是两种常见的数据结构,用于存储和管理数据。栈是一种先进后出(LIFO)的数据结构,类似于我们平时堆叠的一摞书,只能在顶部进行操作。在C++中,可以使用std::stack模板类来创建栈。栈的主要操作包括压入(push)元素到栈顶、弹出(pop)栈顶元素以及获取栈顶元素等。队列是一种先进先出(FIFO)的数据结构,类似于排队等候的人群,新元素插入队尾,最早插入的元素在队头。在C++中,可以使用std::queue模板类来创建队列。

Renswc的博客 2751

第186篇 前馈控制——提升跟踪精度的补充手段

文章摘要: 本文介绍了前馈控制的原理及其在工程中的应用。与反馈控制不同,前馈控制通过提前预测目标值或扰动信息来生成控制量,避免误差出现后再纠正的延迟问题,适用于机器人、机械臂等高速运动场景。前馈控制通常与PID反馈配合使用,前者提供粗调,后者进行微调。文章详细讲解了前馈增益的调节方法(模型法、实验法、自适应法)及两种前馈类型(指令前馈和扰动前馈),并提供了代码示例和面试实战建议,强调前馈与反馈的协同设计是提升控制精度的关键。最后预告了下一篇将讨论串级PID控制架构。

郑伟强dev的专栏 397

队列及C++模板实现

数据结构图文解析系列1.队列简介1.1 队列的特点1.2 队列的相关概念1.3 队列的操作1.4 队列的存储结构2.基于数组的循环队列实现2.1 循环队列的抽象数据类型2.2 队列的具体实现2.3 循环队列代码测试3. 链队列3.1 链表节点3.2 队列的抽象数据类型3.3 队列的具体实现3.4 队列的代码测试4. 队列的完整代码 参考博文:https://www.cnblogs.com/QG-whz/p/5171123.html 1.队列简介 1.1 队列的特点 队列(Queue)与栈一样,是一种线性存储

turnura的博客 336

RK3588适配Ubuntu系统

RKsdk上支持buildroot以及Debian系统,但是Ubuntu需要自己移植,有很多公司都移植好了可以直接用,这里就总结记录一下我制作Ubuntu的过程。

m0_60805802的博客 5360

YOLOv10 的损失函数解析

YOLOv10 在 YOLO 系列的演进中进一步优化了任务解耦与动态平衡策略,通过 ​多模态损失融合、自适应样本分配 和 ​轻量化设计,显著提升了检测精度与推理效率。

浩瀚之水的专栏 1378

【CPP】队列简介及其简化模拟实现

队列简介及其简化模拟实现

BinaryWiker的博客 644

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ 之 【队列的简介 与 模拟实现】

队列是一种数据结构,也是一种特殊的线性表队列只允许在一端进行插入数据操作,在另一端进行删除数据操作。

zl_dfq的博客 613

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数据结构之链式队列以及C++实现与模板

队列的一些说明 队列的定义 队列,一种特殊的线性表 特点:只允许在一端输入,在另一端输出。输入端称为队尾,输出端称为队头 因此,队列,又称为先进先出表(FIFO),类似于生活中的排队,先来的排在前头,后来的排在后头,一个一个办理业务。 队列有两种,一种叫做循环队列(顺序队列),另一种叫做链式队列。 这一篇讲的是链式队列,循环队列在另外一篇文章中 循环队列讲解与C语言实现 链式队列的实现 链式队列 链式队列与单链表是有些类似的,只是多了一个表头(front)和一个表尾(rear)。 front指向首结点,re

ck8719的博客 1439

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++实现顺序队列

@这篇文档是由C++代码实现的环形队列 队列就是先进先出的一种数据结构,这篇文档通过数组实现队列,要求是:队列是线性的(即队列的长度初始化后给定了,如果队列插入元素到了最后一个位置表示队列已满不能再插入新的元素,删除元素也只能从队列的队头开始删除),其次队列的插入类型没有定,所以建立的是模板类和函数模板,最后通过调用类模板在main()函数中实现。 本文是以Visual Studio中新建的C++...

u014114763的博客 3627

C++队列实现

一、相关定义 原理:queue队列也是一个线性存储表,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出FIFO(FirstInFirstOut)表。 队头&队尾:插入一端称为队尾,删除一端称为队首。 C++队列是一种容器适配器,默认使用双端队列deque来实现,将deque容器转换为queue容器。当然,也可以利用其他合适的序列容器作为底层实现que...

Shirven 2471
上一篇: 栈的简介与C++模板实现
下一篇: 哈夫曼树与哈夫曼编码详解及C++模板实现
Tanswer_
博客等级 码龄11年 231粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值