实验目的
- 深入理解队列的“先进先出”特性;
- 掌握链队列及循环队列结构类型定义及其基本算法;
- 能在实际问题背景下灵活运用队列。
实验内容
设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2,…”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出他们的出列顺序。
.cpp文件后缀名
算法思想
- 让所有元素入队
- 当队列不为空时,第奇数个元素出队输出,第偶数个元素重新进队
Source Code
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize]; //存放队中元素
int front,rear; //队头和队尾指针
}SqQueue;
//初始化队列
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=0;
}
//进队
bool enQueue(SqQueue *&q,ElemType e)
{
if((q->rear+1)%MaxSize==q->front)
return false;
q->rear = (q->rear+1)%MaxSize;
q->data[q->rear] = e;
return true;
}
//出队
bool deQueue(SqQueue *&q,ElemType &e)
{
if(q->front==q->rear)
return false;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
return true;
}
//判队列是否为空
bool QueueEmpty(SqQueue *q)
{
return (q->front==q->rear);
}
//销毁队列
void DestroyQueue(SqQueue *&q)
{
free(q);
}
//报数
void Bs(int n)
{
int i;
int count=1; //count用来记第几个元素
SqQueue *q;
InitQueue(q);
for(i=1;i<=n;i++)
{
enQueue(q,i);
}
while(!QueueEmpty(q))
{
deQueue(q,i);
if(count%2==0) //第偶数个元素时,进队
enQueue(q,i);
else
printf("%d ",i); //第奇数个元素时,出队输出
count++;
}
printf("\n");
DestroyQueue(q);
}
int main(void)
{
int n;
printf("输入n的个数:");
scanf("%d",&n);
Bs(n);
return 0;
}
Computational Results
Analyze
在环形队列q中
- 设置队空条件是:q->rear == q->front
- 设置队满条件是:(q->rear+1)%MaxSize == q->front
- 队列中元素个数:(rear-front+MaxSize)%MaxSize