队列:是一种先进先出(FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。
队尾:允许插入的一端。
队头:允许删除的一端。
和线性表类似,队列也可以有两种存储表示。
用链表表示的队列简称链队列,一个链队列显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。这里,和线性表的单链表一样,为了操作方便起见,我们也给链队列添加一个头结点,并令头指针指向头结点。由此,空的链队列的判定条件为头指针和尾指针均指向头结点。一般情况下,删除队列的头元素时仅需修改头结点的指针,但当队列中的最后一个元素被删后,队列尾指针也丢失了,因此需对队尾指针重新赋值(指向头结点)。
//---------------单链队列-----------------
//LinkQueue.h
#ifndef LINK_QUEUE_H
#define LINK_QUEUE_H
#define OK 1
#define OVERFLOW -2
#define Status bool
#define TRUE 1
#define FALSE 0
#define ERROR 0
typedef int SElemType;
typedef struct QNode
{
SElemType data;
struct QNode *next;
}QNode, *QNodePtr;
typedef struct
{
QNodePtr front; //队头指针
QNodePtr rear; // 队尾指针
}LinkQueue;
Status InitQueue(LinkQueue &Q);
Status DestroyQueue(LinkQueue &Q);
Status QueueEmpty(LinkQueue Q);
int Queuelength(LinkQueue Q);
Status EnQueue(LinkQueue &Q, SElemType e);
Status DeQueue(LinkQueue &Q, SElemType &e);
Status QueueTraverse(LinkQueue Q, void (*visit)(QNodePtr));
#endif
//LinkQueue.cpp
#include "LinkQueue.h"
#include "stdlib.h"
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QNodePtr)malloc(sizeof(QNode));
if (!Q.front) exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status DestroyQueue(LinkQueue &Q)
{
while (Q.front)
{
QNodePtr pNode = Q.front;
Q.front = Q.front->next;
free(pNode);
}
Q.rear = Q.front = NULL;
return OK;
}
Status QueueEmpty(LinkQueue Q)
{
if (Q.front == Q.rear)
return TRUE;
else
return FALSE;
}
int Queuelength(LinkQueue Q)
{
QNodePtr pNode = Q.front->next;
int len = 0;
while (pNode)
{
len ++;
pNode = pNode->next;
}
return len;
}
Status EnQueue(LinkQueue &Q, SElemType e)
{
QNodePtr pNode = (QNodePtr)malloc(sizeof(QNode));
pNode->data = e;
if (!pNode) exit(OVERFLOW);
pNode->next = Q.rear->next;
Q.rear->next = pNode;
Q.rear = pNode;
return OK;
}
Status DeQueue(LinkQueue &Q, SElemType &e)
{
if (Q.front == Q.rear) return ERROR;
QNodePtr pNode = Q.front->next;
e = pNode->data;
Q.front->next = pNode->next;
if (pNode == Q.rear) Q.rear = Q.front;
free(pNode);
return OK;
}
Status QueueTraverse(LinkQueue Q, void (*visit)(QNodePtr p))
{
QNodePtr pNode = Q.front->next;
while (pNode)
{
visit(pNode);
pNode = pNode->next;
}
return OK;
}