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

二、队列的实现
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低.
2.1 队列的结构
// 链式结构:表示队列
typedef int QDataType;
typedef struct QListNode
{
struct QListNode* next;
QDataType data;
}QNode;
// 队列的结构
typedef struct Queue
{
QNode* front;
QNode* rear;
}Queue;
2.2 初始化队列QueueInit
// 初始化队列
void QueueInit(Queue* q) {
assert(q);
q->front = q->rear = NULL;
}
2.3 销毁队列QueueDestroy
// 销毁队列
void QueueDestroy(Queue* q) {
assert(q);
QNode* cur = q->front;
while (cur) {
QNode* next = cur->next;
free(cur);
cur = next;
}
q->front = NULL;
q->rear = NULL;
}
2.4 入队QueuePush
QNode* BuyNode(QDataType data) {
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL) {
perror("BuyNode()::malloc");
exit(1);
}
newnode->data = data;
newnode->next = NULL;
return newnode;
}
// 队尾入队列
void QueuePush(Queue* q, QDataType data) {
assert(q);
QNode* newnode = BuyNode(data);
if (q->rear == NULL) {
q->rear = q->front = newnode;
}
else {
q->rear->next = newnode;
q->rear = newnode;
}
}
2.5 出队QueuePop
// 队头出队列
void QueuePop(Queue* q) {
assert(q);
assert(q->front);
if (q->front->next == NULL) {
free(q->front);
q->front = q->rear = NULL;
}
else {
QNode* next = q->front->next;
free(q->front);
q->front = next;
}
}
2.6 获取队头元素QueueFront
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
assert(q);
assert(q->front);
return q->front->data;
}
2.7 获取队尾元素QueueBack
// 获取队列队尾元素
QDataType QueueBack(Queue* q) {
assert(q);
assert(q->rear);
return q->rear->data;
}
2.8 队列判空QueueEmpty
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q) {
assert(q);
return q->front == NULL ? 0 : 1;
}
2.9 获取元素个数QueueSize
// 获取队列中有效元素个数
int QueueSize(Queue* q) {
assert(q);
if (q->front == NULL) {
return 0;
}
else {
int count = 0;
QNode* cur = q->front;
while (cur!= NULL) {
count++;
cur = cur->next;
}
return count;
}
}
三、代码
3.1 Queue.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 链式结构:表示队列
typedef int QDataType;
typedef struct QListNode
{
struct QListNode* next;
QDataType data;
}QNode;
// 队列的结构
typedef struct Queue
{
QNode* front;
QNode* rear;
}Queue;
// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QDataType QueueFront(Queue* q);
// 获取队列队尾元素
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);
3.2 Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
// 初始化队列
void QueueInit(Queue* q) {
assert(q);
q->front = q->rear = NULL;
}
QNode* BuyNode(QDataType data) {
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL) {
perror("BuyNode()::malloc");
exit(1);
}
newnode->data = data;
newnode->next = NULL;
return newnode;
}
// 队尾入队列
void QueuePush(Queue* q, QDataType data) {
assert(q);
QNode* newnode = BuyNode(data);
if (q->rear == NULL) {
q->rear = q->front = newnode;
}
else {
q->rear->next = newnode;
q->rear = newnode;
}
}
// 队头出队列
void QueuePop(Queue* q) {
assert(q);
assert(q->front);
if (q->front->next == NULL) {
free(q->front);
q->front = q->rear = NULL;
}
else {
QNode* next = q->front->next;
free(q->front);
q->front = next;
}
}
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
assert(q);
assert(q->front);
return q->front->data;
}
// 获取队列队尾元素
QDataType QueueBack(Queue* q) {
assert(q);
assert(q->rear);
return q->rear->data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q) {
assert(q);
if (q->front == NULL) {
return 0;
}
else {
int count = 0;
QNode* cur = q->front;
while (cur!= NULL) {
count++;
cur = cur->next;
}
return count;
}
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q) {
assert(q);
return q->front == NULL ? 0 : 1;
}
// 销毁队列
void QueueDestroy(Queue* q) {
assert(q);
QNode* cur = q->front;
while (cur) {
QNode* next = cur->next;
free(cur);
cur = next;
}
q->front = NULL;
q->rear = NULL;
}
3.3 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void test01() {
Queue q = { 0 };
QueueInit(&q);//测试初始化
QueuePush(&q, 1);//测试入队
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
printf("Queue的元素个数为%d\n", QueueSize(&q));//测试计算元素个数
while (QueueEmpty(&q) != 0) {//测试队列是否为空
printf("%d ", QueueFront(&q));//测试取队头元素
QueuePop(&q);//测试出队
}
QueueDestroy(&q);//测试销毁队列
}
int main() {
test01();
return 0;
}