码迷,mamicode.com
首页 > 其他好文 > 详细

约瑟夫环问题(循环队列)

时间:2014-11-23 22:57:40      阅读:590      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   for   on   

  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 }

 

约瑟夫环问题(循环队列)

标签:style   blog   io   ar   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/leetao94/p/4117622.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!