💨队列的概念及结构
✔概念
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。
队列具有先进先出的特点。
✔结构
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
💨队列的实现
💨初始化
void QueueInit(Queue* pq) //初始化
{
assert(pq);
pq->head = pq->tail = NULL;
}
💨入队列
void QueuePush(Queue* pq, QDataType x) //队尾入
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof (QNode));
if(newnode == NULL)
{
printf("malloc fail\n");
exit(-1);
}
newnode->data = x;
newnode ->next = NULL;
if(pq->tail == NULL)
{
pq->head = pq->tail =newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
}
💨出队列
void QueuePop(Queue* pq) //队头出
{
assert(pq);
assert(pq->head);
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;
}
}
💨取队头数据
//取队头的数据
QDataType QueueFront(Queue* pq)
{
assert(pq);
assert(pq->head);
return pq->head->data;
}
💨取队尾数据
//取队尾的数据
QDataType QueueBack(Queue* pq)
{
assert(pq);
assert(pq->head);
return pq->tail->data;
}
💨取数据的个数
int QueueSize(Queue* pq)//取数据个数
{
assert(pq);
int size = 0;
QNode * cur = pq->head;
while (cur)
{
++size;
cur = cur->next;
}
return size;
}
💨判断队列是否为空
bool QueueEmpty(Queue* pq) //判断是否为空
{
assert(pq);
return pq->head == NULL;
}
💨销毁队列
void QueueDestory(Queue* pq) //销毁一个队列
{
assert(pq);
QNode * cur = pq->head;
while(cur)
{
QNode * next = cur->next;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
}
💨队列头文件Queue.h
#ifndef QUEUE_QUEUE_H
#define QUEUE_QUEUE_H
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
typedef int QDataType;
typedef struct QueueNode
{
struct QueueNode* next;
QDataType data;
}QNode;
typedef struct Queue
{
QNode* head; //头
QNode* tail; //尾
}Queue;
void QueueInit(Queue * pq); //初始化
void QueueDestory(Queue* pq); //销毁一个队列
void QueuePush(Queue* pq, QDataType x); //队尾入
void QueuePop(Queue* pq); //队头出
//取队头的数据
QDataType QueueFront(Queue* pq);
//取队尾的数据
QDataType QueueBack(Queue* pq);
int QueueSize(Queue* pq);//取数据个数
bool QueueEmpty(Queue* pq); //判断是否为空
#endif