一、队列的介绍
概念
队列:只允许在一段进行插入数据操作,在另一端进行删除数据操作的特殊线性表。具有先进先出的特点。
入队列:进行插入操作的一端称为队尾。
b.出队列:进行删除操作的一端成为队头。
结构
生活中队列的运用实例
队列在生活中的运用非常广泛。很大一部分医院、营业厅以及餐厅等场所都存在队列的应用。
例如,医院的采血环节的流程就运用了队列。在医院,如果我们要去抽血,我们首先要在旁边的抽号机抽取自己的编号,当某一个抽血窗口叫到你时,你便可以去抽血了。
在这个过程中,当你在抽号机抽取到某一个编号,那么这个编号这时就从队尾入队列,当某一窗口抽血结束后,会在该队列中拿走一个编号并叫该编号的人到这个窗口接受抽血,那么这时这个编号就从队头出队列。
二、队列的实现
初始化队列
首先,我们需要创建一个结点类型,类型包含了该节点的数据和指向下一结点的指针。
typedef int QDataType;
typedef struct QListNode
{
struct QListNode* next;
QDataType data;
}QListNode;
队列与普通链表又有所不同,普通链表只需要直到链表的头指针,而队列的信息包括了队头和队尾,所以我们需要再创建一个结构体用于存放队列的队头和队尾。
typedef struct Queue
{
QListNode* head;
QListNode* tail;
}Queue;
然后我们需要一个初始化函数,对刚创建的队列进行初始化。
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
销毁队列
void QueueDestory(Queue* pq)
{
assert(pq);
QListNode* cur = pq->head;
while (cur)
{
QListNode* next= cur->next;
free(cur);
cur->next;
}
pq->head = NULL;
pq->tail = NULL;
}
队尾入队列
入队列,即申请一个新结点并将其链接到队尾,然后改变队尾的指针指向即可。需要注意的是:若队列中原本无数据,那么我们只需让队头和队尾均指向这个新申请的结点即可。
void QueuePush(Queue* pq, QDataType x)
{
assert(pq);
QListNode* newnode = (QListNode*)malloc(sizeof(QListNode));
if (newnode == NULL)
{
printf("malloc fail\n");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
if (pq->head == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
}
队头出队列
出队列,即释放队头指针指向的结点并改变队头指针的指向即可。若队列中只有一个结点,那么直接将该结点释放,让后将队头和队尾置空即可。
void QueuePop(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = NULL;
pq->tail = NULL;
}
else
{
QListNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
}
获取队列头部元素
获取队列头部元素,即返回队尾指针指向的数据即可。
QDataType QueueFront(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->data;
}
获取队列尾部元素
获取队列尾部元素,即返回队尾指针指向的数据即可。
QDataType QueueBack(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}
检测队列是否为空
检测队列是否为空,即判断队头指针指向的内容是否为空。
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->head == NULL;
}
获取队列中有效元素个数
队列中有效元素个数,即队列中的结点个数。我们只需遍历队列,统计队列中的节点数并返回即可。
int QueueSize(Queue* pq)
{
assert(pq);
QListNode* cur = pq->head;
int count = 0;
while (cur)
{
count++;
cur = cur->next;
}
return count;
}