数据结构(二)——栈和队列之约瑟夫出圈

本文介绍如何利用数据结构中的队列解决约瑟夫问题,即n个人围成一圈,从第一个人开始报数,报到m的人出圈,直到所有人都出圈。以n=41, m=3为例,详细阐述了构造循环队列、入队、出队的操作,以及如何每隔m-1个人执行出圈操作的实现细节。" 114291327,5546599,NUC980 Linux 4.4 BSP 官方虚拟机与编译指南,"['嵌入式开发', 'Linux', '设备驱动', '虚拟机', '嵌入式Linux']
摘要由CSDN通过智能技术生成

问题描述:用队列实现约瑟夫出圈问题: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;//新节点入队指针调整
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值