循环队列之约瑟夫环

此问题的要求为:n个人围坐一圈,从第一个人开始数,每数到k,这个人就出列,圈中的下一个人重新从1开始计数,直到剩余人数不足k人

下面我画图来加深理解(抱歉目前还不会用电脑绘制动画,只好手动绘制,比较粗糙,之后有时间我改进下!!(看起来像个效果器上面的一堆旋钮哈哈哈

在这里插入图片描述

下面附上完整代码:

//约瑟夫环 
#include<stdio.h>
#include<stdlib.h>

typedef struct 
{
	int *data;
	int front,rear;
	int queuesize;
	int length;
}Queue;

void Init (Queue *Q)                  //构造一个队列 
{
	Q->queuesize = 100;
	Q->data = (int *)malloc(Q->queuesize*sizeof(int));
	Q->front = Q->rear = 0;
	Q->length = 0;
}

void build (Queue *Q)                   //为队列赋值 
{
	int i,n;
	printf("请输入环中元素个数:\n");
	scanf("%d",&n);
	printf("请输入元素:\n");
	for(i=0;i<n;i++)
	{
		scanf("%d",&Q->data[Q->rear]); 
		Q->length++;
		Q->rear = (Q->rear+1)%100;
	}
	/*for(i=0;i<n;i++)								//检验是否入队成功 
	{
		printf("%d ",Q->data[Q->front]);
		Q->front = (Q->front+1)%100;
	}*/ 
	printf("\n------%d-----\n",Q->length);          //输出队列长度 
	Q->front = 0;
}

void EnQue (Queue *Q,int e)                        //入队 
{
	if((Q->rear+1)%100 != Q->front)
	{
			Q->data[Q->rear] = e;
			Q->rear = (Q->rear+1)%100;
	}
}

void OutQue(Queue *Q)                              //出队 
{
	if(Q->rear != Q->front)
	{
		Q->front = (Q->front+1)%100;
	}
}

void display(Queue *Q)                        //输出(也包含出队的功能) 
{
	if(Q->rear != Q->front)
	{
		printf("%d ",Q->data[Q->front]);
		Q->front = (Q->front+1)%100;
	}
}

void yuesefu(Queue *Q)
{
	int  k=1,e;
	while(Q->rear!=Q->front&&Q->length>=3)
	{
		e = Q->data[Q->front];
		if(k == 3)
		{
			display(Q);
			k = 1;
			Q->length--;
		}
		else
		{
			OutQue(Q);								//就是让这个不出列的数先从头出队,再从队尾入队 
			EnQue(Q,e);
			k++;
		}
	}
}


int main()
{
	Queue Q;
	Init(&Q);
	build(&Q);
	yuesefu(&Q);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43260290/article/details/83957385