队列实现约瑟夫环

#include<stdio.h>
#include<stdlib.h> 
int MAXQSIZE;     		//循环队列长度为(MAXQSIZE-1)
typedef struct{         //定义队列 
	int*base;
	int front;
	int rear;
}SqQueue;
void init(SqQueue&L)    //创建循环队列并初始化 
{
	L.base=(int*)malloc(MAXQSIZE*sizeof(int));
	if(!L.base)         //若创建失败退出程序 
		exit(0);
	L.front=L.rear=0;   //初始化队列赋空 
}
void input(SqQueue&L)   //初始化循环队列  赋初值 
{
	int a,b;
	while(1)            //循环输入当按下回车时结束 
	{
		scanf("%d",&a);
		L.base[L.rear]=a;
		L.rear++;
		b=(MAXQSIZE+L.rear-L.front)%MAXQSIZE;
		if(getchar()=='\n'||b==MAXQSIZE-1)  //判断是否按下回车以及队是否已满 
		break;
	}
}
int DeQueue(SqQueue&L) //出队函数 并返回值 
{
	int e;
	if(L.front==L.rear)  //判断队列是否为空若为空提示有关信息 
		printf("队列已为空\n");
	else                 //不为空队头出队e记录 
	{
		e=L.base[L.front];
		L.base[L.front]=0;
		L.front++;
		if(L.front>=MAXQSIZE)
			L.front%=MAXQSIZE;
	} 
	return e;
}
void EnQueue(SqQueue&L,int e) //入队函数 
{
	if((MAXQSIZE+L.rear-L.front)%MAXQSIZE==MAXQSIZE-1)
		printf("队列已满");   //判断队列是否已满若满提示有关信息 
	else                      //未满在队尾入队 
	{
		L.base[L.rear]=e;
		L.rear++;
		if(L.rear>=MAXQSIZE)
			L.rear%=MAXQSIZE;
	}
}
void output(SqQueue&L,int start,int distance)//总功能函数 
{                //接收队列起始位置与间隔调用函数输出结果 
	int count=1,i,e;
	while(L.front!=start-1)  //调用出队入队函数将用户输入位置变为队头 
	{
		e=DeQueue(L);
		EnQueue(L,e);
	}
	while(L.front != L.rear) //当队列不为空时循环输出约瑟夫环的序列 
	{
	  if(count!=distance)    //count计算用户输入的间隔 
	  {                      //不满足到队尾 
	  	e=DeQueue(L);         
		EnQueue(L,e);
		count++;
	  }	
	  else                   //满足则出队
	  {
	  	e=DeQueue(L);
	  	printf("%d ",e);
	  	count=1;
	  }	
	} 
	printf("\n");
}
int main()                 //主函数 
{
	 SqQueue L;
        printf("输入队列长度:");
        scanf("%d",&MAXQSIZE);
        MAXQSIZE+=1;
        int start,distance;
        init(L);
        printf("输入值:");
        input(L);
        printf("输入起始位置与要排除的数:");
	scanf("%d%d",&start,&distance);   
	output(L,start,distance);
	return 0;
}

将所有的元素全部入队,然后再一个个出队,出队的时候记录出队的个数,如果不是第k个,就让他重新入队,如果是第k个,就不用入队了,然后下一个出队的再重新从1开始计算。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值