队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作,进行插入的一端称为队尾,进行删除的一端称为对头或队首。常用的队列有顺序队列,循环队列等。
顺序队列:建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。如图所示:
从上图可以看出,当队列为空时,头尾指针相等,即front和rear相等,入队时执行rear++,即是在队尾插入一个元素,出队front++,即是在队首删除一个元素,当全部出队时,front和rear又相等。不论是出队还是入队,front和rear都是增长的,这样会出现溢出现象。
循环队列:为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。
如图所示:在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件时front=rear,而队列判满的条件时front=(rear+1)%MaxSize。
#include <stdio.h>
#include <stdlib.h>
#define g_MAX 10
//定义队列结构
typedef struct queue
{
char data[g_MAX];
int front, rear;
}QUEUE;
//创建队列
QUEUE InitQueue()
{
QUEUE Q;
Q.front = 0;
Q.rear = 0;
return Q;
}
//插入操作
QUEUE InsertQueue(QUEUE Q, char x)
{
//判断队列是否上溢,即
if(Q.rear >= g_MAX)
{
printf("up overflow!\n");
}
else
{
Q.rear++;
Q.data[Q.rear]=x;
printf("insert success!\n");
}
return 0;
}
//删除操作
QUEUE DeleteQueue(QUEUE Q)
{
if(Q.front == Q.rear)
{
printf("queue is empty!\n");
}
else
{
Q.front++;
printf("delete success!\n");
}
return 0;
}