文章目录
简介
队列是一种类似于单向隧道一样的数据结构,数据只能从一端进入,然后从另一端输出,先进入的先弹出,后进入的后弹出。
入队列:向队列中添加元素的操作叫做入队列,如图1所示。
出队列:从队列中取出元素的操作叫做出队列,如图2所示。
队列的数据结构和API函数:
我们教程中的队列是以线性表为基础实现的,因此队列的数据结构与线性表是一样的,队列的API也是在线性表的基础上实现的。队列就是只允许在最前端插入元素,在最尾端取出元素的线性表。为了简单方便,我们以单向链表为基础实现队列及其API函数。
队列的数据结构
c
//将List类型定义为Queue
typedef List Queue;
队列生成函数:
c
Queue *QueueCreate()
{
//定义一个Queue类型的指针
Queue *temp = NULL;
//利用ListCreate给分配队列空间
temp = (Queue *)ListCreate();
//返回队列指针
return temp;
}
应用代码
c
Queue *myqueue = NULL;
//建立一个栈
myqueue = QueueCreate();
队列销毁函数:
c
int QueueDestroy(Queue **queue)
{
int ret;
//利用ListDestory销毁Queue
ret = ListDestory(queue);
//返回操作的结果
return ret;
}
应用代码:
c
QueueDestroy(&myqueue);
队列清空函数:
c
int QueueClear(Queue *queue)
{
int ret;
//利用ListClear清空Queue
ret = ListClear(queue);
//返回操作的结果
return ret;
}
应用代码:
c
QueueClear(&mystack);
队列长度获取函数:
c
int QueueGetlen(Queue *queue)
{
int ret;
//利用ListGetLength获取队列长度
ret = ListGetLength(queue);
//返回队列的长度
return ret;
}
应用代码:
c
len = QueueGetlen(myqueue);
队列空检测函数:
c
int QueueEmpty(Queue *queue)
{
int len;
//获取队列的长度
len = QueueGetlen(queue);
//如果长度为0,说明队列为空,返回1
if (len == 0)
{
return 1;
}
return 0;
}
应用代码:
c
printf("QueueEmpty:%d\n", QueueEmpty(myqueue));
队列满检测函数:
c
int QueueFull(Queue *queue)
{
int len;
len = QueueGetlen(queue);
if (len == xx)
{
return 1;
}
return 0;
}
队列满函数与队列空函数类似,也是根据长度来判断的,因为我们使用的线性表是单向链表,元素可以动态地增加,因此无法判断其何时为满;当采用的线性表为顺序表时,该函数才有意义;也可以自己设定一个最大长度,当队列内元素等于该值时,无法插入元素,从而实现队列满,本文对此不做过多阐述。
元素入队列函数:
c
int QueueIn(Queue *queue, int data)
{
int ret;
//利用ListAdd在队列首部插入元素
ret = ListAdd(queue, 0, data);
//返回操作的结果
return ret;
}
应用代码:
c
for (i = 0; i < 5; i++)
{
QueueIn(myqueue, i);
}
元素出队列函数:
c
int QueueOut(Queue *queue)
{
int ret;
int data;
//判断长度是否为空
if (QueueEmpty(queue) == 1)
{
return -1;
}
//利用ListDelete在队列尾部取出元素
ret = ListDelete(queue, QueueGetlen(queue) -1, &data);
//如果操作无误,返回数据,否则返回-1
if (ret == 0)
{
return data;
}
return -1;
}
应用代码:
c
for (i = 0; i < 5; i++)
{
printf("%d:%d\n", i, QueueOut(myqueue));
}