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;
}