文章目录
- 前言
- 一、队列基本变量的了解
- 二、队列的基本操作
- 2.1队列的初始化(QueueInit)
- 2.2入队(QueuePush)
- 2.3判断是否为空队(QueueEmpty)
- 2.4出队(QueuePop)
- 2.5队列的队头数据(QueueFront)
- 2.6队列的队尾数据(QueueBack)
- 2.7队列大小(QueueSize)
- 2.8队列的销毁(QueueDestroy)
前言
提示:以下是本篇文章正文内容,下面案例可供参考
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
一、队列基本变量的了解
typedef int QDataType;//队列数据类型
typedef struct QueueNode {
QDataType data;//数据域
struct QueueNode* next;//指针域
}QNode;//先建立一个结点
typedef struct Queue {
QNode* head;//头
QNode* tail;//尾
int size;//队列数量
}Queue;//将头与尾还有数量封装在一起能更好操作
二、队列的基本操作
2.1队列的初始化(QueueInit)
void QueueInit(Queue* pq) {
assert(pq);
pq->head = pq->tail = NULL;
//刚开始没有数据,所以头尾都为NULL
pq->size = 0;//数量
}
2.2入队(QueuePush)
void QueuePush(Queue* pq,QDataType x) {
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL) {
perror("malloc error");
return;
}//判断是否为有效空间
newnode->data = x;
newnode->next = NULL;
//初始化新结点
if (pq->head == NULL) {
assert(!pq->tail);
pq->head = pq->tail = newnode;
//之所以要分开判断是因为
//我们也要保证只有一个数据时
//head与tail指向同一个
//如果只有else虽然也能够正常插入
//但是tail一直指向NULL
}
else {
pq->tail->next = newnode;
//在尾巴后面接上也就是入队
pq->tail = pq->tail->next;
//尾巴改变,指向新加入的数据
}
pq->size++;//数据+1
}
2.3判断是否为空队(QueueEmpty)
bool QueueEmpty(Queue* pq) {
assert(pq);
return pq->size==0;
//数量为0返回为真,真为空,假为不空
}
2.4出队(QueuePop)
void QueuePop(Queue* pq) {
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head->next == NULL) {
free(pq->head);//只有一个元素
//直接将尾巴与头置空
pq->head = pq->tail = NULL;
}
else {
QNode* Next = pq->head->next;
//记录队头下一个结点
free(pq->head);
//释放队头
pq->head = Next;
//队头指向下一个位置
}
pq->size--;//数量减少
}
2.5队列的队头数据(QueueFront)
QDataType QueueFront(Queue* pq) {
assert(pq);
assert(!QueueEmpty(pq));
//判断是否为空队列
return pq->head->data;
//直接去队头数据
}
2.6队列的队尾数据(QueueBack)
QDataType QueueBack(Queue* pq) {
assert(pq);
assert(!QueueEmpty(pq));
//判断是否为空队列
return pq->tail->data;
}
2.7队列大小(QueueSize)
int QueueSize(Queue* pq) {
assert(pq);
return pq->size;
}
2.8队列的销毁(QueueDestroy)
void QueueDestroy(Queue* pq) {
assert(pq);
QNode* cur = pq->head;
//记录当前结点
while (cur) {
QNode* Next = cur->next;
//当前结点的下一个结点
free(cur);
//释放当前节点
cur = Next;
//让当前结点指向下一个结点
}
pq->head = pq->tail = NULL;
//最后头尾都NULL
pq->size = 0;
}