数据结构与算法学习笔记三---队列的链式存储表示和实现(C++)

目录

前言

1.队列的概念

2.队列的表示和实现

1.定义

1.初始化

2.入队

3.出队

4.获取队头元素

5.判断是否是空队列

6.完整代码


前言

    这篇博客主要讲的是对队列的链式存储。

1.队列的概念

        队列是一种访问受限的线性表。仅允许在表的一端进行插入操作,在表的另一端进行删除操作。和日常生活中的排队是一致的,最先进入队列的元素最早离开。插入的一端称为队头(front),删除的一端称为队尾(rear)。

        队列的示意图如下:

        图1.队列的示意图

2.队列的表示和实现

1.定义

        我们使用指针我们使用指向结点元素的指针分别表示队列的队头和队尾。

typedef int ElemType;
typedef struct QNode{ElemType data;struct QNode * next;
}QNode,*QueuePtr;typedef struct {QueuePtr  front,rear;
}LinkQueue;

1.初始化

        链队列的初始化是构造一个只有一个头结点的空队,使队头和队尾指针指向次节点,并将节点的指针置为NULL。如下图2所示。

        图2.链队列的操作示意图

队列的初始化代码如下:

//初始化
Status initLinkQueue(LinkQueue *queue) {queue->front = queue->rear = new QNode;if (!queue->front) {return 0; // 内存分配失败}queue->front->next = NULL;return 1;
}

3.入队

        入队的过程其实是生成一个新的节点,并且修改尾指针,并且把尾指针设置称为新的节点。

//入队
Status enQueue(LinkQueue *queue, ElemType e) {QueuePtr p = new QNode;if (!p) {return 0; // 内存分配失败}p->data = e;p->next = NULL;queue->rear->next = p;queue->rear = p;return 1;
}

4.出队

        连队列的出队首先是判断链队列是否为空,如果为空,则不操作;否则取出表头元素,修改头指针。

//出队
Status deQueue(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}QueuePtr p = queue->front->next;*e = p->data;queue->front->next = p->next;if (queue->rear == p) {queue->rear = queue->front; // 如果出队后队列为空,修改队尾指针}delete p;return 1;
}

5.获取队头元素

        获取链队列头元素的时候,首先要判断链队列是否是空队列,如果队列为空,不操作;否则,获取队列的头结点的下一个元素即可(因为我们这里用到了头结点,头结点的数据域是不可用使用的)。

//获取队列头元素
Status getHead(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}*e = queue->front->next->data;return 1;
}

6.判断是否是空队列

        这里当队头和队尾相同的时候,链队列即为空队列。

//判空
Status isEmpty(LinkQueue *queue) {return queue->front == queue->rear;
}

7.完整代码

#include <iostream>
using namespace std;typedef int ElemType;
typedef int Status;
typedef struct QNode {ElemType data;struct QNode *next;
} QNode, *QueuePtr;typedef struct {QueuePtr  front, rear;
} LinkQueue;//初始化
Status initLinkQueue(LinkQueue *queue) {queue->front = queue->rear = new QNode;if (!queue->front) {return 0; // 内存分配失败}queue->front->next = NULL;return 1;
}//入队
Status enQueue(LinkQueue *queue, ElemType e) {QueuePtr p = new QNode;if (!p) {return 0; // 内存分配失败}p->data = e;p->next = NULL;queue->rear->next = p;queue->rear = p;return 1;
}//出队
Status deQueue(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}QueuePtr p = queue->front->next;*e = p->data;queue->front->next = p->next;if (queue->rear == p) {queue->rear = queue->front; // 如果出队后队列为空,修改队尾指针}delete p;return 1;
}//获取队列头元素
Status getHead(LinkQueue *queue, ElemType *e) {if (queue->front == queue->rear) {return 0; // 队列为空}*e = queue->front->next->data;return 1;
}//判空
Status isEmpty(LinkQueue *queue) {return queue->front == queue->rear;
}int main(int argc, const char * argv[]) {LinkQueue queue;initLinkQueue(&queue);// 入队enQueue(&queue, 1);enQueue(&queue, 2);enQueue(&queue, 3);// 出队并打印ElemType e;while (!isEmpty(&queue)) {deQueue(&queue, &e);cout << e << " ";}cout << endl;return 0;
}

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

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

相关文章

n5.树(中)

1、二叉树的遍历 1.1先序、中序、后序遍历 先序遍历 根->左->右 先序遍历先访问根节点&#xff0c;再访问它的左子树&#xff0c;然后访问它的右子树。对于每次访问到的结点&#xff0c;都要递归地访问左子树、后右子树———递归。 创建 typedef struct TreeNode*…

更适合户外使用的开放式耳机,佩戴舒适音质悦耳,虹觅HOLME NEO体验

随着气温的逐渐升高&#xff0c;不管是在室内工作娱乐&#xff0c;还是到户外运动健身&#xff0c;戴上一款合适的耳机都会帮我们隔绝燥热与烦闷&#xff0c;享受音乐与生活。现在市面上的耳机类型特别多&#xff0c;我很喜欢那种分体式的开放耳机&#xff0c;感觉这种耳机设计…

关于各类软件下载及使用

文章目录 一、VS Code1、下载2、安装3、使用 二、Dev-C1、下载2、安装3、使用 三、VS20191、下载2、安装3、使用 四、IDEA1、下载2、安装3、使用 五、Fiddler1、下载1.1 官网下载1.2 文件下载 2、安装3、使用 一、VS Code 1、下载 2、安装 3、使用 二、Dev-C 1、下载 2、…

Centos7安装图形化界面

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Centos7安装图形化界面https://myweb.myskillstree.cn/43.html 目录 一、安装GNOME桌面 二、开机自启动修改为命令行模式 三、卸载图形化界面 一、安装GN…

JavaScript 动态网页实例 —— 事件处理应用

前言 事件处理的应用很广泛。在事件处理的应用中,鼠标事件的应用是最常用到的。本章给出几个鼠标事件处理应用的示例,包括:页面预览、图像切换、点亮文本、鼠标跟随、鼠标感应和禁用鼠标按键。在这些示例中,有的可以直接拿来应用,有的则只提供了一种应用的方法,稍加拓展,…

【计算机网络】数据链路层的功能

数据链路层的基本功能&#xff1a; 封装成帧透明传输差错检测 数据链路层使用的信道主要有两种 点对点信道——PPP协议广播信道——CSMA/CD协议(有线局域网)、CSMA/CA协议(无线局域网) 数据链路层所处的地位 从图中可以看出&#xff0c;数据从主机H1送到主机H2需要在路径中…

使用 sudo apt upgrade 出现的提示

┌────────────────────────────────────────────────┤ Pending kernel upgrade ├────────────────────────────────────────────────┐ │ …

vue3+TS或JS, 实现粒子特效 @tsparticles/vue3

在跟着B站视频BV11s4y1a71T学习时&#xff0c;使用到了粒子效果&#xff0c;但是以下这种情况只适用于项目是基于typescript的写法&#xff0c;否则无法实现。 粒子效果 VUE3TStsparticles/vue31、安装2、main.ts 引入3、App.vue4、效果 VUE3JS非最新版1、安装低版本的vue3-pa…

ACC-UNet: A Completely Convolutional UNet Model for the 2020s

文章目录 ACC-UNet: A Completely Convolutional UNet Model for the 2020s摘要方法实验结果 ACC-UNet: A Completely Convolutional UNet Model for the 2020s 摘要 这十年以来&#xff0c;计算机视觉领域引入了 Vision Transformer&#xff0c;标志着广泛的计算机视觉发生了…

同程旅行基于Proxy的Kafka最佳实践

公众号文章&#xff1a;同程旅行基于Proxy的Kafka最佳实践 Apache Kafka&#xff0c;作为当前企业级数据流处理的首选平台&#xff0c;由于其高吞吐量和可扩展性而深受欢迎。 然而&#xff0c;随着企业数据量的爆炸性增长和业务需求的多样化&#xff0c;Kafka 集群面临着各种挑…

模型 空船效应

1 空船效应的应用 1.1 空船效应帮助客户服务人员面对挑战性客户 赵敏是一家大型电信公司的客户服务经理。在一次服务中&#xff0c;一位客户因为网络连接问题而非常愤怒&#xff0c;他通过电话对赵敏大声抱怨&#xff0c;并要求立即解决问题。一般在这种情况下&#xff0c;客…

暗区突围哪里获得测试资格 暗区突围测试资格获取方法

在游戏业界的浩瀚星空中&#xff0c;《暗区突围》如同一颗璀璨新星&#xff0c;以其独树一帜的游戏模式和前所未有的沉浸式体验&#xff0c;迅速吸引了全球玩家的目光。它不仅仅是一款游戏&#xff0c;更像是一次对勇气、智慧与团队合作的深度探索。玩家在危机四伏的暗区中&…