在数据结构的栈和队列的学习过程中,除了需要了解栈、队列的基本特点外,需要掌握包括创建、出栈入栈、出队入队等基本操作。并熟悉一些常见的应用问题,比如球钟问题就是一个典型利用栈和队列实现的实际问题。本文描述球钟问题的具体实现过程。球钟是一个利用球的移动来记录时间的简单装置.它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器.若分钟指示器中有2个球,五分钟指示器中有6个球,小时指示器中有5个球,则时间为5:32.球钟的工作原理如下:分钟指示器最多可容纳4个球.每过一分钟,球钟就会从球队列的队首取出一个球放入分钟指示器,当放入第五个球时,在分钟指示器的4个球就会按照他们被放入时的相反顺序加入球队列的队尾.而第五个球就会进入五分钟指示器.按此类推,五分钟指示器最多可放11个球,小时指示器最多可放11个球.当小时指示器放入第12个球时,原来的11个球按照他们被放入时的相反顺序加入球队列的队尾,然后第12个球也回到队尾.这时,三个指示器均为空,回到初始状态,从而形成一个循环.因此,该球钟表示时间的范围是从0:00到11:59.现设初始时球队列的球数为x(27≤x≤127),球钟的三个指示器初态均为空.问要经过多少天(每天24小时),球钟的球队列才能回复原来的顺序。
相关代码如下
/** *@filename ballclock.c *@author haohaibo *@data 2017/4/13 *@brief 球钟问题解决 **/ #include "stack.h" #include "lqueue.h" #include "ballclock.h" /** *@brief 解决球钟问题 **/ int ball_clock() { int lq_i=1,mincount=0; int min,fmin,hour=0; lq_t *lq1=linkqueue_creat(); //创建一个队列 seqstack_t* s1=seqstack_creat(); //定义分钟栈,五分钟栈,小时栈 seqstack_t* s2=seqstack_creat(); seqstack_t* s3=seqstack_creat(); for(lq_i=1;lq_i<=M;lq_i++) linkqueue_in(lq1,lq_i); //队列加入1-27 //linkqueue_show(lq1); while(1) { if(s1->top<3) //-1~2 共容纳4个值 { seqstack_insert(s1,linkqueue_out(lq1)); //出列数据放入分钟栈 } else //分钟栈数值即将超过4 { for(min=0;min<4;min++) //栈内数据入列 { linkqueue_in(lq1,seqstack_out(s1)); } if(s2->top<10) //-1-9容纳11个值 { seqstack_insert(s2,linkqueue_out(lq1)); //出列入栈 } else //五分钟栈值即将超过11个 { for(fmin=0;fmin<11;fmin++) { linkqueue_in(lq1,seqstack_out(s2)); //出栈入列 } if(s3->top<10) { seqstack_insert(s3,linkqueue_out(lq1)); } else { for(hour=0;hour<11;hour++) { linkqueue_in(lq1,seqstack_out(s3)); } linkqueue_in(lq1,linkqueue_out(lq1)); } } } mincount++; if(lq_check(lq1)) break; } return mincount; } /** *@brief 检查数据是否回到最初状态 **/ int lq_check(lq_t *lq) { int count=0; lqn_t *p=lq->front->Next; while(p!=NULL&&p->Next!=NULL) { if(p->data>p->Next->data) //保证队列中的数据前一个都小于后一个 return 0; p=p->Next; count++; } return count==26?1:0; //且队列中一共有27个值 } /** *@brief 用于调试 **/ /* puts("!!*************"); linkqueue_show(lq1); printf("lq1->real=%p,lq->front=%p\n",lq1->real,lq1->front); printf("s3->top=%d,s2->top=%d,s1->top=%d\n",s3->top,s2->top,s1->top); puts("**************!!"); */
一下是全部文件的链接
http://download.csdn.net/detail/u010916862/9813659