一、队列的结构及概念
队列是只允许在一端进行插入数据操作,在另一端进行删除数据的操作的特殊线性表,队列具有先进先出(FIFO)。进行插入操作的一端称为队尾,进行删除操作的一端称为队头。
二、队列的实现
1、队列的创建
队列的实现也可以用数组或者链表实现,但是相对于数组,队列的链表实现更优一些,因为对数组进行头部删除元素相对比较麻烦。
2、头文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int QDataType;
typedef struct QueueNode
{
QDataType data;
QueueNode* next;
}QueueNode;
typedef struct Queue
{
QueueNode* head;
QueueNode* tail;
}Queue;
void QueueInit(Queue* qt);//初始化
void QueueDestroy(Queue* qt);//销毁队列
void QueuePush(Queue* qt,QDataType x);//队头插入
void QueuePop(Queue* qt);//队尾删除
QDataType QueueFront(Queue* qt);//获取队头元素
QDataType QueueTail(Queue* qt);//获取队尾元素
int QueueSize(Queue* qt);//队列长度
int QueueEmpty(Queue* qt);//判断队列是否为空
3、初始化
void QueueInit(Queue* qt)//初始化
{
assert(qt);
qt->head = qt->tail = NULL;
}
4、销毁队列
void QueueDestroy(Queue* qt)//销毁队列
{
assert(qt);
QueueNode* cur = qt->head;
while (cur)
{
QueueNode* next = cur->next;
free(cur);
cur = next;
}
qt->head == qt->tail==NULL;
}
5、 队尾插入
void QueuePush(Queue* qt, QDataType x)//队尾插入
{
assert(qt);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
if (newnode == NULL)
{
printf("内存不足\n");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
if (qt->head == NULL)
{
qt->head=qt->tail= newnode;
}
else
{
qt->tail->next = newnode;
qt->tail = newnode;
}
}
6、队头删除
void QueuePop(Queue* qt)//队头删除
{
assert(qt);
QueueNode* next = qt->head->next;
free(qt->head);
qt->head = next;
if (qt->head == NULL)//防止队尾变成野指针
{
qt->tail = NULL;
}
}
7、获取队头队尾元素
QDataType QueueFront(Queue* qt)//获取队头元素
{
assert(qt);
assert(qt->head);
return qt->head->data;
}
QDataType QueueTail(Queue* qt)//获取队尾元素
{
assert(qt);
assert(qt->tail);
return qt->tail->data;
}
8、队列长度
int QueueSize(Queue* qt)//队列长度
{
assert(qt);
int size = 0;
QueueNode* cru = qt->head;
while (cru)
{
size++;
cru = cru->next;
}
return size;
}
9、判断是否为空
int QueueEmpty(Queue* qt)//判断队列是否为空
{
assert(qt);
return qt->head == NULL ? 1 : 0;
}