-
队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头
-
队列的实现
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头,上出数据,效率会比较低。
声明:该图片并非原创,单纯只是为了大家能更好的理解队列的结构。
-
队列接口的实现:
-
<Queue.h>
-
#pragma once #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> typedef int QUDataType; typedef struct QueueNode { QUDataType _data; struct QueueNode* _next; }QueueNode; typedef struct Queue { QueueNode* _front;//队头 QueueNode* _rear;//队尾 }Queue; void QueueInit(Queue* q); void QueueDestroy(Queue* q); void QueuePush(Queue* q, QUDataType x);//在队头入数据 void QueuePop(Queue* q);//在队头出数据 int QueueSize(Queue* q);//数据的个数 int QueueEmpty(Queue* q);//判断是否为NULL QUDataType QueueFront(Queue* q);//取出队头数据 QUDataType QueueBack(Queue* q);//取出队尾数据
-
<Queue.c>
#include "Queue.h"
void QueueInit(Queue* q)//置空即可
{
assert(q);
q->_front = q->_rear = NULL;
}
void QueueDestroy(Queue* q)
{
assert(q);
QueueNode* cur = q->_front;
while (cur)
{
QueueNode* next = cur->_next;
free(cur);
cur = next;
}
q->_front = q->_rear = NULL;
}
QueueNode* BuyQueueNode(QUDataType x)
{
QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));//这里注意开辟的是一个结构体,而不是整形
node->_data = x;
node->_next = NULL;
return node;
}
void QueuePush(Queue* q, QUDataType x)//在队头入数据
{
assert(q);
if (q->_front == NULL)
{
q->_front = q->_rear = BuyQueueNode(x);
}
else
{
q->_rear->_next = BuyQueueNode(x);
q->_rear = q->_rear->_next;
}
}
void QueuePop(Queue* q)//在队头出数据
{
assert(q);
if (q->_front)
{
QueueNode* next = q->_front->_next;
free(q->_front);
q->_front = next;
if (q->_front == NULL)//当front为NULL时,back还未置空,如果队尾不置空,会出现野指针的问题
{
q->_rear = NULL;
}
}
}
int QueueSize(Queue* q)//数据的个数
{
assert(q);
int size = 0;
QueueNode* cur = q->_front;
while (cur)
{
cur = cur->_next;
size++;
}
return size;
}
int QueueEmpty(Queue* q)//判断是否为NULL
{
assert(q);
if (q->_front == NULL)
{
return 0;
}
else
{
return 1;
}
//return q->_front==NULL ? 0:1;
}
QUDataType QueueFront(Queue* q)//取出队头数据
{
assert(q);
return q->_front->_data;
}
QUDataType QueueBack(Queue* q)//取出队尾数据
{
assert(q);
return q->_rear->_data;
}
-
<test.c>
#include "Queue.h"
void QueueTest()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePop(&q);
while (QueueEmpty(&q))
{
printf("front:%d\n", QueueFront(&q));
QueuePop(&q);
}
}
int main()
{
QueueTest();
system("pause");
return 0;
}