队列
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
队列的基本概念
队列(Queue)简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素素称为入队或进队;删除元素称为出队或离队出队,这和我们日常生活中排队是一致的,要早排队的也是最早离队的,其操作的特性是先进先出(First In First Out,FIFO) 队头(Front)。允许删除的一端,又称队首。 队尾(Rear)。允许插入的一端。 空队列。不含任何元素的空表。
队列常见的基本操作
InitQueue(&Q)//初始化队列,构造一个空队列Q。
QueueEmpty(Q)//判队列空,若队列Q为空返回true,否则返回false。
EnQueue(&Q,x)//入队,若队列Q未满,将x加入,使之成为新的队尾。
DeQueue(&Q,&x)//出队,若队列Q非空,删除队头元素,并用x返回。
GetHead(Q,&x)//读队头元素,若队列Q非空,则将队头元素赋值给x。
队列的顺序存储
队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置。 队列的顺序存储类型可描述为
#define Maxsize 50//定义队列中元素的最大个数
typedef struct(()
Elemrype data[MaxSize];//存放队列元素
int front,rear;//队头指针和队尾指针)SqQueue;
初始状态(()队空条件):Q.front==Q.rear==0。 进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。出队操作:队不空时,先取队头元素值,再将队头指针加1。
应用题
若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。 试编写与此结构相应的入队和出队算法。
算法思路:
在循环队列的类型结构中,增设一个tag的整型变量,进队时置tag为1,出队时置tag为0(()因为只有入队操作可能导致队满,也只有出队操作可能导致队空)。队列Q初始时,置tag=0、front=rear=0。这样队列的4要素如下: 队空条件:Q.front==Q.rear且Q.tag==0 队满条件:Q.front==Q.rear且Q.tag==1 进队操作:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%MaxSize;Q.tag=1 出队操作:x=Q.data[Q.front];Q.front=(()Q.front+1)%MaxSize;Q.tag=0。
//设“tag”法的循环队列入队算法:
int EnQueue1(SqQueue &Q,ElemType x){
if(Q.front==Q.rear&&Q.tag==1)
return 0;//两个条件都满足时则队满
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%Maxsize;
Q.tag=1;//可能队满
return 1;
}
//设“tag”法的循环队列出队算法:
int DeQueuel(SqQueue &Q,ElemType &x){
if(Q.front==Q.rear&&Q.tag==0)
return 0;//两个条件都满足时则队空
x=Q.data[Q.front];
Q.front=(Q.front+1)%Maxsize;
Q.tag=0;//可能队空
return 1;
}