队列的操作及应用,利用队列求解报数问题(数据结构)

实验目的

  1. 深入理解队列的“先进先出”特性;
  2. 掌握链队列及循环队列结构类型定义及其基本算法;
  3. 能在实际问题背景下灵活运用队列。

实验内容

设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2,…”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出他们的出列顺序。
.cpp文件后缀名

算法思想

  1. 让所有元素入队
  2. 当队列不为空时,第奇数个元素出队输出,第偶数个元素重新进队

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
  • 17
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值