栈和队列之队列

1.队列

1.1队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

1.2队列的实现

1.准备工作

还是三个文件

头文件中需要包含库函数等

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int QDataType;
//表示队列
typedef struct QueueNode
{int val;struct QueueNode* next;
}QNode;
//队列的结构
typedef struct Queue
{QNode* phead;//头结点指针QNode* ptail;//尾结点指针int size;
}Queue;//初始化
void QueueInit(Queue* qp);
//销毁
void QueueDestory(Queue* qp);
//入队列
void QueuePush(Queue* qp,QDataType x);//出队列
void QueuePop(Queue* qp);
//获取队列头部元素
QDataType QueueFront(Queue* qp);
//获取队列尾部元素
QDataType QueueBack(Queue* qp);
//判断是否为空
bool QueueEmpty(Queue* qp);
//获取队列的有效元数个数
int QueueSize(Queue* qp);

2.初始化队列

初始化队列和初始化栈其实差不多

都是先把指针置为空

然后再将数据置为0

//初始化
void QueueInit(Queue* qp)
{assert(qp);qp->phead = NULL;qp->ptail = NULL;qp->size = 0;}

3.销毁队列

销毁队列的话

就是遍历队列,然后将队列中的指针给free掉

并置为空

数据也置为0

void QueueDestory(Queue* qp)
{assert(qp);QNode* cur = qp->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}qp->phead = qp->ptail = NULL;qp->size = 0;}

4.入队列

首先需要开辟空间

然后检测开辟的空间否为开辟成功

然后就是把数据x传入到val中

让next置为空

如果尾结点不为空,那么就让他的next去指向新的节点,再让新开辟的成为尾结点

并让size++

void QueuePush(Queue* qp, QDataType x)
{assert(qp);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("mallco fall");return;}newnode->val = x;newnode->next = NULL;if (qp->ptail){qp->ptail->next = newnode;qp->ptail = newnode;}else{qp->phead = qp->ptail = newnode;}qp->size++;
}

5.出队列

出队列的话我们需要检测一下,分为多个情况

0  1和多

首先是0个节点

没有节点的话我们需要断言头结点是否为空

一个节点的话,我们需要判断他的头结点的next是否为空

是就是一个节点

那么我们需要释放掉头结点,让头和尾都为空

多个节点的话就需要创建一个新节点

让头结点的next指向新的节点

然后free掉头结点

让新节点成为头结点

最后让size--

void QueuePop(Queue* qp)
{assert(qp);//多种情况,0个节点,一个节点和多个节点温柔检查//if (qp->phead == NULL)//{//	return;//}//暴力检查,0个节点assert(qp->phead != NULL);//一个节点if (qp->phead->next == NULL){free(qp->phead);qp->phead = qp->ptail = NULL;}//多个节点else{QNode* next = qp->phead->next;free(qp->phead);qp->phead = next;}qp->size--;}

6.获取队列头元素

获取头元素就是获取头元素的val

QDataType QueueFront(Queue* qp)
{assert(qp);assert(qp->phead != NULL);return qp->phead->val;}

7.获取队列尾元素

获取尾元素就是获取它的尾的val

QDataType QueueBack(Queue* qp)
{assert(qp);assert(qp->ptail != NULL);return qp->ptail->val;}

8.判断是否为空

判断是否为空只需要返回头和尾节点是否为空

bool QueueEmpty(Queue* qp)//判断空
{assert(qp);return qp->phead == NULL;//qp->size == 0;}

9.有效元素个数

有效元素个数只需要返回他的size就可以了

int QueueSize(Queue* qp)
{assert(qp);return qp->size;
}

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

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

相关文章

2023 2024年全国职业院校技能大赛中职组网络建设与运维赛项服务器Linux部分教程解析

欢迎合作 需要资料请私 Rocky 9 包含各种常考服务(包括新题型KVM等)

一个复杂的数据流转换:文件流转base64

一个复杂的数据流转换&#xff1a;文件流转base64 可是我再也没遇到一个像福贵这样令我难忘的人了&#xff0c;对自己的经历如此清楚&#xff0c;又能如此精彩地讲述自己是如何衰老的。这样的老人在乡间实在是 难以遇上&#xff0c;也许是困苦的生活损坏了他们的记忆&#xff0…

Linux进程详细介绍

文章目录 Linux进程1、计算机体系结构和操作系统管理1.1、计算机体系结构 -- 硬件1.2、操作系统&#xff08;Operator System&#xff09; -- 软件 2、进程2.1、进程基本概念2.2、进程标识符2.2.1、获取当前进程标识符和当前进程的父进程标识符2.2.2、通过系统调用创建进程 -- …

使用Weaviate向量数据库:从Embeddings到Applications (Multilingual Search和RAG)

Vector Databases: from Embeddings to Applications 课程地址&#xff1a;https://www.deeplearning.ai/short-courses/vector-databases-embeddings-applications/ 下面是这门课程的笔记。 使用Weaviate向量数据库&#xff1a;从Embeddings到应用&#xff0c;比如Multilin…

2024.3.5

作业1、使用select实现tcp服务器端&#xff0c;poll实现tcp客户端 服务器端&#xff1a; #include <myhead.h> #define SER_IP "192.168.199.131" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[])…

并发编程并发安全性之Lock锁及原理分析

ReentrantLock 用途:锁是用来解决线程安全问题的 重入锁-> 互斥锁 满足线程的互斥性意味着同一个时刻&#xff0c;只允许一个线程进入到加锁的代码中。多线程环境下&#xff0c;满足线程的顺序访问 锁的设计猜想 一定会涉及到锁的抢占&#xff0c;需要有一个标记来实现互…

django5生产级部署和并发测试(开发者服务器和uvicorn服务器)

目录 1. 创建django项目2. 安装压力测试工具3. 安装生产级服务器uvicorn4. 多进程部署 1. 创建django项目 在桌面创建一个名为django_test的项目&#xff1a; django-admin startproject django_test然后使用cd命令进入django_test文件夹内&#xff0c;使用开发者服务器运行项…

Android开发必须会的技能,Github上最值得学习的10个Android开源项目

学会深入思考&#xff0c;总结沉淀 我想说的第一条就是要学会深入思考&#xff0c;总结沉淀&#xff0c;这是我觉得最重要也是最有意义的一件事。 ‌先来说深入思考。在程序员这个圈子里&#xff0c;常能听到一些言论&#xff1a;我这个工作一点技术含量都没有&#xff0c;每…

Python学习 day07(JSON、format()函数)

JSON 各种编程语言存储数据的容器不尽相同&#xff0c;在Python中有字典dict这样的数据类型&#xff0c;而其他语言可能没有对应的字典&#xff0c;为了让不同的语言都能够相互通用的传递数据&#xff0c;JSON就是一种非常良好的中转数据格式&#xff0c;如下&#xff1a; JSON…

为什么有了HTTP协议,还要有WebSocket协议?

文章目录 使HTTP不断轮询长轮询WebSocket是什么&#xff1f;怎么建立WebSocket连接WebSocket抓包WebSocket的消息格式WebSocket的使用场景总结 平时我们打开网页&#xff0c;比如购物网站某宝。都是点一下列表商品&#xff0c;跳转一下网页就到了商品详情。 从HTTP协议的角度来…

wait() 、notify()、notifyAll() 的详细用法

文章目录 &#x1f490;wait() 讲解&#x1f490;notify() 讲解&#x1f490;notifyAll()&#x1f4a1;wait() 和 sleep() 的区别 首先&#xff0c;我们知道&#xff0c;线程的执行顺序是随机的(操作系统随机调度的&#xff0c;抢占式执行)&#xff0c;但是有时候&#xff0c;我…

详解C#之WinForm版利用RichTextBox 制作文本编辑器【附源码】

在Windows应用程序开发中&#xff0c;刚刚介绍了WPF版的利用RichTextBox实现文本编辑器&#xff0c;今天继续推出WinForm版的利用RichTextBox实现文本编辑器。本文利用一个简单的小例子&#xff0c;简述如何在WinForm开发中&#xff0c;利用RichTextBox开发文本编辑器&#xff…