队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一段进行删除数据操作的特殊线性表,队列具有先进先出的特性。
入队列:进行插入操作的一段称为队尾。
出队列:进行删除操作的一段称为队头。
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
Queue.h 函数声明
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
typedef struct BinaryTreeNode* QDataType;
typedef struct QueueNode
{
QDataType val;
struct QueueNode* next; //链表
}QNode;
typedef struct Queue
{
QNode* phead;
QNode* ptail; //定义两个指针更方便 ,头和尾
int size;
}Queue;
//初始化队列
void QueueInit(Queue* q);
//销毁队列
void QueueDestroy(Queue* q);
//队尾入队列
void QueuePush(Queue* q, QDataType x);
//对头出队列
void QueuePop(Queue* q);
//获取队列头部元素
QDataType QueueFront(Queue* q);
//获取队列尾部元素
QDataType QueueBack(Queue* q);
//获取队列中有效元素的个数
int QueueSize(Queue* q);
//检测队列是否为空
bool QueueEmpty(Queue* q);
在这里我们队尾Push入队列 ,为空要改变结构体需要传二级,所以这里定义了两个结构体指针,类似哨兵位
Queue.c 函数定义
#include"Queue.h"
//初始化队列
void QueueInit(Queue* q)
{
assert(q);
q->phead = NULL;
q->ptail = NULL;
q-> size = 0;
}
//销毁队列
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;
}
//队尾入队列 ,为空要改变结构体需要传二级,这里定定义了两个结构体指针,类似哨兵位
void QueuePush(Queue* q, QDataType x)
{
assert(q);
QNode*newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->val = x;
newnode->next = NULL;
if (q->ptail == NULL)
{
q->ptail = q->phead = newnode;
}
else
{
q->ptail->next= newnode;
q->ptail=newnode;
}
q->size++;
}
//对头出队列,头删
void QueuePop(Queue* q)
{
assert(q);
assert(q->phead);
QNode* del = q->phead;
q->phead = q->phead->next;
free(del);
del= NULL;
if (q->phead == NULL)
q->ptail= NULL;
q->size--;
}
//获取队列头部元素
QDataType QueueFront(Queue* q)
{
assert(q);
assert(q->phead);
return q->phead->val;
}
//获取队列尾部元素
QDataType QueueBack(Queue* q)
{
assert(q);
assert(q->ptail);
return q->ptail->val;
}
//获取队列中有效元素的个数
int QueueSize(Queue* q)
{
assert(q);
return q->size;
}
//检测队列是否为空
bool QueueEmpty(Queue* q)
{
assert(q);
return q->phead == NULL;
}
test.c
#include"Queue.h"
int main()
{
Queue q;
//初始化队列
QueueInit(&q);
//队尾入队列
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
while (!QueueEmpty(&q))
{
printf("%d ", QueueFront(&q));
QueuePop(&q);
}
QueueDestroy(&q);
return 0;
}