目录
一、队列的概念
队列的结构就是先进先出(First In First Out)(FIFO)、尾进头出。
由于队列是尾进头出,如果用顺序结构实现难以找到队列头部,于是我将使用链式结构实现队列。
二、队列的实现
1.Queue.h
这里我们将队列(Queue)和队列的节点(QueueNode/QNode )分别用结构体实现,在队列中记录队列的头尾指针,以及队列长度,节点中包含节点值和指向下一节点的指针。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#include <assert.h>
typedef int QDataType;
typedef struct QueueNode
{
QDataType val;
struct QueueNode* next;
}QNode; //队列节点
typedef struct Queue
{
QNode* phead;
QNode* ptail;
int size;
}Queue; //用来记录队列的头尾节点以及大小
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
bool QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);
2.Queue.c
1.初始化队列
void QueueInit(Queue* pq) {
assert(pq);
pq->phead = pq->ptail = NULL;
pq->size = 0;
}
2.队列的销毁
void QueueDestroy(Queue* pq) {
assert(pq);
QNode* cur = pq->phead;
while (cur) {
QNode* next = cur->next;
free(cur);
cur = next;
}
pq->phead = pq->ptail = NULL;
pq->size = 0;
}
3.入队
入队的时候其实顺带创建了节点,和单链表单独用CreateNode函数实现不同。
void QueuePush(Queue* pq, QDataType x) {
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL) {
perror("malloc fail!!");
return;
}
newnode->val = x;
newnode->next = NULL;
if (pq->ptail == NULL) {
pq->ptail = pq->phead = newnode;
}
else {
pq->ptail->next = newnode;
pq->ptail = newnode;
}
pq->size++;
}
4.出队
void QueuePop(Queue* pq) {
assert(pq);
assert(pq->phead);
QNode* del = pq->phead;
pq->phead = pq->phead->next;
free(del);
del = NULL;
if (pq->phead == NULL)
pq->ptail = NULL;
pq->size--;
}
5.返回队头数据
QDataType QueueFront(Queue* pq) {
assert(pq);
asser(pq->phead);
return pq->phead->val;
}
6.返回队尾数据
QDataType QueueBack(Queue* pq) {
assert(pq);
asser(pq->ptail);
return pq->ptail->val;
}
7.判断队列是否为空
bool QueueEmpty(Queue* pq) {
assert(pq);
return pq->phead == NULL;
}
8.返回队列长度
int QueueSize(Queue* pq) {
assert(pq);
return pq->size;
}
三、总结
队列十分简单。