队列(Queue)
1.队列的定义
队列(Queue)是只允许在表的一端进行插入,而在表的另一端进行删除操作的线性表。
向队列中插入元素称为入队或进队;删除元素称为出队或离队。其操作特性为先进先出(First In First Out,FIFO),并且只允许在队尾进,队头出。
队列与栈:与栈相反,队列是一种先进先出(First In First Out,FIFO)的线性表。与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础
队列和栈的应用广泛,浏览器的历史记录是栈的应用,我们的输入输出缓冲区接收键盘的输入就是按队列的形式输入和输出的。
2.队列的链式存储结构
我们将对头指针指向链队列的头结点,而队尾指针指向终端结点。
空队列时,front和rear都指向头结点。
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode,*QueuePrt;
typedef struct {
QueuePrt front,rear;
}LinkQueue;
3.创建一个队列
initQueue(LinkQueue *q)
{
q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!q->front)
exit(0);
q->front->next=NULL;
}
4.入队列操作
InsertQueue(linkQueue *q,ElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(p==NULL)
exit(0);
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
5.出队列操作
将队列中的第一个元素移出,对头指针不发生改变,改变头结点的next指针即可。
如果原队列只有一个元素,那么我们就应该处理一下队尾指针。
DeletQueue(LinkQueue *q,ElemType *e)
{
QueuePtr p;
if(q->front==q->rear)
return ;
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
free(p);
}
6.销毁一个队列
由于链队列建立在内存的动态区,因此当一个队列不再有用时应当把它及时销毁掉,以免过多地占用内存空间。
DestroyQueue(LinkQueue *q)
{
while(q->front){
q->rear=q->front ->next;
free(q->front);
q->front =q->rear;
}
}
循环队列
定义一个循环队列
#define MAXSIZE 100
typedef struct
{
ElemType *base;
int front;
int rear;
}
初始化一个循环队列
initQueue(cycleQueue *q)
{
q->base=(ElemType*)malloc(MAXSIZE *sizeof(ElemType));
if(!q->base)
exit(0);
q->front=q->rear=0;
}
入队列操作
InsertQueue(cycleQueue *q,ElemType e)
{
if((q->rear+1)%MAXSIZE==q->front)
return ;
q->base[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
}
出队列操作
DeleteQueue(cycleQueue *q,ElemType *e)
{
if(q->front==q->rear)
return ;
*e=q->base[q->front];
q->front=(q->front+1)%MAXSIZE;
}