1.队列的概念及结构
队列:只允许在一段进行插入数据操作,在另一端惊醒删除数据操作的特殊线性表。队列具有先进先出FIFO(First In First Out)的原则。
入队列:进行插入操作的一端称为队尾。
出对点:进行删除操作的一端称为对头。
2.队列的实现
队列也可以数组和链表的结构实现,使用链表结构更优一些,因为如果使用数组结构,出队列在数组头出数据,效率回比较低。
分为三个文件实现:头文件,函数实现文件,测试文件
头文件
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
//队列节点声明
typedef int QData;
typedef struct QueueNode
{
struct QueueNode* next;
QData data;
}QN;
//队列整体声明
typedef struct Queue
{
QN* phead;
QN* ptail;
int size;
}Queue;
//队列初始化声明
void QueueInit(Queue* pq);
//队列销毁声明
void QueueDestory(Queue* pq);
//队列判空声明
bool QueueEmpty(Queue* pq);
//队列尾插声明
void QueuePush(Queue* pq, QData x);
//队列头删声明
void QueuePop(Queue* pq);
//返回队头元素
QData QueueFront(Queue* pq);
//返回队尾元素
QData QueueBack(Queue* pq);
//返回队列元素个数
int QueueSize(Queue* pq);
函数实现文件
#include"Queue.h"
//队列初始化实现
void QueueInit(Queue* pq)
{
assert(pq);
pq->phead = NULL;
pq->ptail = NULL;
pq->size = 0;
}
//队列销毁实现
void QueueDestory(Queue* pq)
{
assert(pq);
QN* cur = pq->phead;
while (cur)
{
QN* next = cur->next;
free(cur);
cur = next;
}
pq->phead = pq->ptail = NULL;
pq->size = 0;
}
//队列判空实现
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->phead == NULL;
}
//队列尾插实现
void QueuePush(Queue* pq, QData x)
{
assert(pq);
QN* newnode = (QN*)malloc(sizeof(QN));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->next = NULL;
newnode->data = x;
if (pq->ptail == NULL)
{
assert(pq->phead == NULL);
pq->phead = pq->ptail = newnode;
}
else
{
pq->ptail->next = newnode;
pq->ptail = pq->ptail->next;
}
pq->size++;
}
//队列头删实现
void QueuePop(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->phead->next == NULL)
{
free(pq->phead);
pq->phead = pq->ptail = NULL;
}
else
{
QN* next = pq->phead->next;
free(pq->phead);
pq->phead = next;
}
pq->size--;
}
//返回队头元素
QData QueueFront(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->phead->data;
}
//返回队尾元素
QData QueueBack(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->ptail->data;
}
//返回队列元素个数
int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
测试文件
#include"Queue.h"
void test()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePop(&q);
printf("size:%d\n", QueueSize(&q));
printf("front:%d\n", QueueFront(&q));
printf("back:%d\n", QueueBack(&q));
while (!QueueEmpty(&q))
{
printf("%d ", QueueFront(&q));
QueuePop(&q);
}
QueueDestory(&q);
}
//int main()
//{
// test();
// return 0;
//}