前言

一、队列的介绍
队列是一种常见的数据结构,可以用来存储和管理一组元素。它有点像我们平时排队等待服务的场景,比如我们去超市买东西,我们会在收银台前排队,先来的人先服务,后来的人排在后面等待服务。
队列遵循这种先进先出(First-In-First-Out,FIFO)的原则。也就是说,先添加到队列中的元素,也会先被取出来。
二、队列的实现
总览
这里采用两个结构体的原因:由于设置头指针(head)和尾指针(tail)
,如果不再设置一个结构体来封装这两个指针,之后传参会很麻烦。


Queue.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int QDateType;
typedef struct QueueNode
{
QDateType date;
struct QueueNode* next;
}QN;
typedef struct Queue
{
QN* head;
QN* tail;
}Queue;
void QueueInit(Queue* ps);
void QueueDestroy(Queue* ps);
void QueuePush(Queue* ps, QDateType x);
void QueuePop(Queue* ps);
//返回头节点的数据
QDateType QueueFront(Queue* ps);
//返回尾节点的数据
QDateType QueueBack(Queue* ps);
int QueueSize(Queue* ps);
bool QueueEmpty(Queue* ps);
void QueuePrint(Queue* ps);
Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
void QueueInit(Queue* ps)
{
assert(ps);
ps->head = NULL;
ps->tail = NULL;
}
void QueueDestroy(Queue* ps)
{
assert(ps);
QN* cur = ps->head;
while (cur != NULL)
{
Queue* next = cur->next;
free(cur);
cur = next;
}
ps->head = ps->tail = NULL;
}
void QueuePush(Queue* ps, QDateType x)
{
assert(ps);
QN* newnode = (QN*)malloc(sizeof(QN));
assert(newnode);
newnode->date = x;
newnode->next = NULL;
if (ps->head == NULL)
{
ps->head = ps->tail = newnode;
}
else
{
ps->tail->next = newnode;
ps->tail = newnode;
}
}
void QueuePop(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));//判断是否为空
QN* next = ps->head->next;
free(ps->head);
ps->head = next;
if (ps->head == NULL)
{
ps->tail = NULL;
}
}
QDateType QueueFront(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
return ps->head->date;
}
QDateType QueueBack(Queue* ps)
{
assert(ps);
assert(!QueueEmpty(ps));
return ps->tail->date;
}
int QueueSize(Queue* ps)
{
assert(ps);
int count = 0;
QN* cur = ps->head;
while (cur != NULL)
{
cur = cur->next;
count++;
}
return count;
}
bool QueueEmpty(Queue* ps)
{
assert(ps);
return ps->head == NULL;
}
void QueuePrint(Queue* ps)
{
assert(ps);
QN* cur = ps->head;
while (cur != NULL)
{
printf("%d ", cur->date);
cur = cur->next;
}
if (ps->head != NULL)
{
printf("\n");
}
printf("队列大小为%d\n", QueueSize(ps));
}
Test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
//队列 - 链表
//前出后进
void test()
{
Queue s;
QueueInit(&s);
QueuePush(&s, 3);
QueuePush(&s, 9);
QueuePush(&s, 5);
QueuePush(&s, 2);
QueuePush(&s, 1);
printf("队列头数据为%d\n", QueueFront(&s));
printf("队列尾数据为%d\n", QueueBack(&s));
//等价于QueuePrint(&s);
while (!QueueEmpty(&s))
{
QDateType front = QueueFront(&s);
printf("%d ", front);
QueuePop(&s);
}
printf("\n");
QueueDestroy(&s);
}
int main(void)
{
test();
return 0;
}
该文介绍了队列的概念,作为先进先出(FIFO)的数据结构,然后详细展示了如何用C语言实现一个基于链表的队列,包括初始化、入队、出队、获取头尾元素、检查队列状态和打印队列等功能。

118





