队列的简单应用-杨辉三角和约瑟夫环
2012-08-06 22:32
260 查看
接上一篇,由于队列的内容相对比较简单,所以这次举两个实际的问题—杨辉三角和约瑟夫环。(不知道这两个问题的童鞋可以自行百度。)
先看杨辉三角。使用队列解决这个问题有1个小的技巧:第一就是在两个1的两边增加两个0,通过0来标记这一层的结束。先看程序吧:
这个做法很巧妙:先让元素出队,再获得后面的那个元素,然后再将二者相加以后入队,重复这个工作,直到遇见0为止。这个0既是上一层队列结束的0,又是这一层队列开始的0.
下面是约瑟夫环的程序:(我承认我写的很丑陋,但是貌似可以用)
可以通过打开调试语句来看到他是如何一步一步执行的。
这个问题貌似有更简单的解法,这里就不深入讨论了。
先看杨辉三角。使用队列解决这个问题有1个小的技巧:第一就是在两个1的两边增加两个0,通过0来标记这一层的结束。先看程序吧:
//遍历循环链表并打印 void printQueue(Queue *q) { for(int i = 0; i < Qlength(q);++i) printf("%d ",q->data[(q->front+i+q->Qsize)%q->Qsize]); printf("\n"); } //输出杨辉三角的第n行的元素 void YangHuiTriangle(int n) { int level = n; //printf("请输入"); Queue myQueue; initQueue(&myQueue,level); //初始化第一行:使用0作为一行结束的标记 enQueue(&myQueue,0); enQueue(&myQueue,1); enQueue(&myQueue,1); enQueue(&myQueue,0); int x,y; for(int m = 1;m < level;++m) { do{ //将整个队列的前两个求和放入队尾,并删除队首元素 deQueue(&myQueue,&x); getHead(&myQueue,&y); enQueue(&myQueue,x+y); }while(y!=0); //填充队尾标记 enQueue(&myQueue,0); } printQueue(&myQueue); }
这个做法很巧妙:先让元素出队,再获得后面的那个元素,然后再将二者相加以后入队,重复这个工作,直到遇见0为止。这个0既是上一层队列结束的0,又是这一层队列开始的0.
下面是约瑟夫环的程序:(我承认我写的很丑陋,但是貌似可以用)
//输入size-1个数,每隔interval个数将它去掉,输出最后的结果 void Josephus(int size,int interval) { Queue JQueue; initQueue(&JQueue,size); //给原先的队列赋出值 for(int l = 0; l < size-1; ++l) { enQueue(&JQueue,l); } //先打印赋值结果 printQueue(&JQueue); int sum = size-1; //计数器:用来计算隔了多个数 int counter = 0; int i = 0; //每隔interval个数(包含这个数)去掉一个数,最后会剩下interval-1个数 while(sum != interval-1) { // printf("i = %d\n",i); // int j = i%(JQueue.Qsize-1); // int k = JQueue.data[(JQueue.front+i+JQueue.Qsize-1)%(JQueue.Qsize-1)]; // printf("第%d个元素,值为%d\n",j,k); //如果这个元素之前已经被去掉过,那么跳过它 if(JQueue.data[(JQueue.front+i+JQueue.Qsize-1)%(JQueue.Qsize-1)] == -1) { // printf("跳过第%d个元素\n",i%JQueue.Qsize); ++i; continue; } if((counter+1)%interval == 0) { //如果需要被去掉,则标记为-1 JQueue.data[(JQueue.front+i+JQueue.Qsize-1)%(JQueue.Qsize-1)] = -1; // printf("第%d个元素被置为-1\n",i%(JQueue.Qsize-1)); --sum; counter = 0; } else ++counter; ++i; } for(int i = 0; i < Qlength(&JQueue);++i) { if(JQueue.data[JQueue.front+i] != -1) printf("%d ",JQueue.data[(JQueue.front+i+JQueue.Qsize)%JQueue.Qsize]); } printf("\n"); destroyQueue(&JQueue); }
可以通过打开调试语句来看到他是如何一步一步执行的。
这个问题貌似有更简单的解法,这里就不深入讨论了。
相关文章推荐
- 简单约瑟夫环【队列实现】
- java多线程之阻塞队列BlockingQueue的简单应用
- 输出杨辉三角 队列小应用
- 第三章:队列及其应用之一---输出杨辉三角
- ActiveMQ的最简单应用-队列消息
- 17年东北四省赛A题-简单stl应用-优先队列
- 链队列简单应用将输入的句子输出
- UVA 10954 Add All【优先队列简单应用】
- 分享一个基于java ArrayList的简单MQ队列,用在连接多个蓝牙设备一个一个连接的应用中
- 简单的队列应用
- c# .net windows消息队列简单应用示例
- 循环链表的简单应用(约瑟夫环问题场景)
- 设头指针的循环单向队列及其约瑟夫环应用
- 消息队列及PHP中的简单实现与应用
- 经典第五章 例 5-6 UVA 540 Team Queue(队列的简单应用)【queue】
- Queue 队列 写日志简单应用
- 队列的简单应用
- STL库之队列的简单应用
- hdu1702ACboy needs your help again!(栈和队列的简单应用)
- [置顶] spring boot 使用activeMQ实现消息队列简单应用