首页 > 代码库 > 约瑟夫环问题(循环队列)
约瑟夫环问题(循环队列)
1 ////////////////////////////////////////////////////////////////////////////// 2 // SqQueue.cpp 3 // 4 // author:Leetao 5 ////////////////////////////////////////////////////////////////////////////// 6 // 简介: 7 // 约瑟夫环问题:设有编号为1,2,……,n的n(n>0)个人围成一个圈. 8 //从第1个人开始报数,报到sp时停止报数,报sp的人出圈,再从他的下一个人起重新报数, 9 //报到sp时停止报数,报sp的出圈,……,如此下去,直到所有人全部出圈为止. 10 ////////////////////////////////////////////////////////// /////////////////// 11 /** 12 * 13 * 14 * @author Leetao 15 * @version 1.0 16 * @date 2014.11.23 17 *//////////////////////////////////////////////////////////////////////////// 18 #include<stdio.h> 19 #include<malloc.h> 20 21 #define MAXQSIZE 100 //最大队列长度 22 23 typedef int QElem; 24 typedef int Status; 25 26 typedef struct 27 { 28 QElem *base; //初始化的动态分配储存空间 29 int front; //头指针 30 int rear; //尾指针 31 } SqQueue; 32 33 //初始化队列 34 Status InitQueue(SqQueue &Q,int n) 35 { 36 Q.base=(QElem *)malloc((n+1)*sizeof(QElem)); 37 if(Q.base==NULL) //内存分配失败 38 { 39 printf("error!n"); 40 } 41 Q.front=Q.rear=0; //空队列*很重要,之前一直报错,最后才发现 42 43 return 0; 44 } 45 46 //插入元素e为队尾元素 47 Status EnQueue(SqQueue &Q,int n,QElem e) 48 { 49 if((Q.rear+1)%(n+1)==Q.front) 50 { 51 printf("the queue is full already!\n"); 52 53 } 54 Q.base[Q.rear]=e; 55 // printf("%d ",Q.base[Q.rear]); 56 Q.rear=(Q.rear+1)%(n+1); 57 58 return 0; 59 } 60 61 //删除队列头元素,用e作返回值返回 62 Status DeQueue(SqQueue &Q,int n) 63 { 64 int e; 65 if(Q.front==Q.rear) 66 { 67 printf("error!\n"); 68 } 69 e=Q.base[Q.front]; 70 Q.front=(Q.front+1)%(n+1); 71 72 return e; 73 } 74 75 int main() 76 { 77 SqQueue Q; 78 int m,n,sp,k=0; 79 80 printf("enter the numbers of elements in the Joseph ring:\n"); 81 scanf("%d",&n); 82 83 printf("enter the starting position(1-%d):\n",n); 84 scanf("%d",&m); 85 86 printf("enter the number to stand up:\n"); 87 scanf("%d",&sp); 88 89 //初始化 90 InitQueue(Q,n); 91 92 for(int i=1; i<=n; i++) //将n个人从1到n的编号放入队列中 93 { 94 EnQueue(Q,n,i); 95 } 96 97 for(int j=1; j<m; j++) 98 { 99 EnQueue(Q,n,DeQueue(Q,n)); //将起始位置变为头 100 } 101 102 printf("约瑟夫环得到序列为: \n");103 while(k<n)104 {105 for(int j=1; j<sp; j++)106 { 107 EnQueue(Q, n, DeQueue(Q, n)); //数到sp,使数sp的人成为队列头108 }109 printf("%d ", DeQueue(Q,n)); //打印出队头及数到sp的人110 111 k++;112 }113 printf("\n");114 return 0;115 }
约瑟夫环问题(循环队列)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。