有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)

1. 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)

这是一道数据结构对与循环队列的应用,首先要了解什么是队列,队列和栈的区别。队列的进出方法。队列是要求从尾进头出,当然这是一种俗的说法,各自有各自的方法,任务是要做出题来,也有很多好的方法可用!!

我用的方法是链队,对于链队来说比起顺序队不用担心数组的溢出,当然对于这一题来说删除数据更方便!首先先将每个人编号,然后将队列首尾相接,就像一个环形一样的链,然后用循环来将数到3的人的编号输出,剩余最后一个在输出就行啦。在写的过程中也会碰到很多的问题,代码如下:

yuesehan.cpp:
#include <iostream>
#include <stdio.h>
#include "han.h"
#include "Status.h"
using namespace std;

int main()
{
LinkQueue Q;
InitQueue(Q);
int i,n;
ElemType e = 0;
cout<<"输入共有多少人参加"<<endl;
cin>>n;
for(i = 1;i<=n;i++)
{
EnQueue(Q,i);
}
Main(Q,n,e);
return 0;
}


han.h:
#include <iostream>
#include <stdlib.h>
#include "Status.h"
using namespace std;

typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;


typedef struct 
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;

Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear=new QNode;


if(!Q.front)
{
exit(OVERFLOW);
}
Q.front->next = NULL;
return OK;
}


Status EnQueue(LinkQueue &Q,ElemType e)
{
QueuePtr p;
p = new QNode;
if(!p)
exit(OVERFLOW);
p -> data = e;
p -> next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}


Status DeQueue(LinkQueue &Q,ElemType &e)
{
QueuePtr p;
p = new QNode;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p)
{
Q.rear = Q.front;
}
delete p;
return OK;
}


void Main(LinkQueue &Q,int n,int e)
{
Q.front = Q.front->next;
Q.rear->next = Q.front;
int j;
bool flag = false;
cout<<"淘汰编号的序列"<<endl;
while(n != 1)
{
j = 1;
if(flag == false)
{
for(j = 1;j<2;j++)
{
Q.front = Q.front->next;
flag = true;
}
}
else
{
for(j = 1;j<3;j++)
{
Q.front = Q.front->next;
}
}
DeQueue(Q,e);
cout<<e<<" ";
n--;
}
cout<<endl;
cout<<"最后剩下的一人是原来的第"<<Q.front->data<<"号"<<endl;
}


Status.h:
 
#define TRUE 1
#define FALSE 0l
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

输出结果:

输入共有多少人参加
10
淘汰编号的序列
3 6 9 2 7 1 8 5 10 
最后剩下的一人是原来的第4号

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值