问题描述:用队列实现约瑟夫出圈问题:n个人排成一圈,从第一个开始报数, 报到m 的人出圈,剩下的人继续开始从1报数,直到所有的人都出圈为止(以n=41,m=3 为例)
本问题运用数据结构中的队列进行求解,通过以链表构造循环队列进行求解,解决该问题的两个关键步骤。
一、构造一个循环队列,并实现循环队列的入队和出队操作。
二、用简便的方法实现每隔m-1个人进行出圈操作。
首先,这里先给出数据结构的定义:
typedef struct node{
int num;
struct node*next;
struct node*prev;
}Node,*pnode;
typedef struct queue{
pnode head;//定义队头
pnode tail;//定义队尾
pnode deque;
int size;//定义队列的长度
}Queue,*pqueue;
以上是循环队列和其队列结点的定义
一、构造一个循环队列,并实现循环队列的入队和出队操作。
1.初始化队列
pqueue InitQueue()
{
pqueue Q=(pqueue)malloc(sizeof(Queue));//构造队列
Q->tail=NULL;
Q->head=Q->tail;
Q->size=0;
return Q;
}
2.入队操作
void EnQueue(pqueue Q,int e)//入队
{
pnode n;
n=(pnode)malloc(sizeof(Node));
if(Q->size==0)//判断队是否为空
{
Q->tail=n;
Q->head=n;
Q->tail->num=e;//数据Q->tail=Q->head;//队尾和队首重叠赋值
Q->size++;
}
else
{
Q->tail->next=n;//新节点入队指针调整