题目:队列的应用
本文已参与「新人创作礼」活动,一起开启掘金创作之路
设有n个人站成一排,从左向右的编号分别为1~n,现在从左向右报数“1,2,1,2,……”,数到1的人出列,数到2的立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止,要求给出出列顺序。如,n=8时初始序列为:1 2 3 4 5 6 7 8,出列顺序为:1 3 5 7 2 6 4 8。
做本题之前,我们需要先明确,什么是队列:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
通俗一点讲,队列就像我们排队做核酸一样,先排队的先进行核酸检测,与栈不同,队列是先进先出。
顺序队列
建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置,如图所示:
每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。随着插入和删除操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构所分配的连续空间中移动。当front=rear时,队列中没有任何元素,称为空队列。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元。
下面是顺序队列的代码实现:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int front;
int rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue *&q){
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}
//销毁队列
void DestoryQueue(SqQueue *&q){
free(q);
}
//判断队列是否为空
bool QueueEmpty(SqQueue *q){
return (q->front==q->rear);
}
//进队列
bool enQueue(SqQueue *&q,ElemType e){
if(q->rear==MaxSize-1)
return false;//队满溢出
q->rear++;
q->data[q->rear]=e;
return true;
}
//出队列
bool deQueue(SqQueue *&q,ElemType &e){
if(q->front==q->rear)
return false; //队空
q->front++;
e=q->data[q->front];
return true;
}
int main(){
SqQueue *h;
ElemType e;
int n;
InitQueue(h);
printf("请输入您的队列人数:");
scanf("%d",&n);
for(e=1;e<=n;e++){
enQueue(h,e);
}
while(!QueueEmpty(h)){
deQueue(h,e);
printf("%d ",e);
if(!QueueEmpty(h)){
deQueue(h,e);
enQueue(h,e);
}
}
printf("\n");
DestoryQueue(h);
}