一、原理
队列通常是链表结构,只允许在一端进行数据插入,在另一端进行数据删除。
队列的特性是链式存储(随机增删)和先进先出(FIFO:First In First Out)。
队列的缺陷:
- 不支持随机访问
- 不支持随机增删
- 每个数据都需要维护一个指针,增大了空间资源消耗
二、Queue.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node;
typedef struct Queue
{
Node* head;
int size;
}Queue;
void Init(Queue* q)
{
// 初始化创建一个空的头节点
q->head = (Node*)malloc(sizeof(Node));
q->head->next = NULL;
q->size = 0;
}
int Empty(Queue* q)
{
return q->size == 0;
}
void Push(Queue* q, DataType x)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = x;
node->next = NULL;
Node* cur = q->head;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = node;
++q->size;
}
void Pop(Queue* q)
{
if (Empty(q))
{
printf("队列为空,pop失败\n");
return;
}
Node* cur = q->head->next;
q->head->next = cur->next;
free(cur);
cur = NULL;
--q->size;
}
DataType Front(Queue* q)
{
if (Empty(q))
{
printf("队列为空,无队列首元素\n");
return NULL;
}
return q->head->next->data;
}
void Destroy(Queue* q)
{
while (!Empty(q))
{
Pop(q);
}
free(q->head);
q->head = NULL;
printf("队列销毁成功\n");
}
int Size(Queue* q)
{
return q->size;
}
void Print(Queue* q)
{
if (Empty(q))
{
printf("队列为空\n");
return;
}
Node* cur = q->head->next;
while (cur != NULL)
{
printf("%2d ", cur->data);
cur = cur->next;
}
printf(",队列首元素:%2d,队列长度为:%d\n", Front(q), Size(q));
}
三、test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
int main()
{
Queue q;
Init(&q);
Push(&q, 1);
Push(&q, 3);
Push(&q, 5);
Push(&q, 7);
Push(&q, 2);
Push(&q, 4);
Push(&q, 6);
Push(&q, 8);
Print(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Print(&q);
Push(&q, 9);
Print(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Pop(&q);
Print(&q);
Push(&q, 10);
Push(&q, 20);
Print(&q);
Destroy(&q);
Print(&q);
}