C语言球钟问题

在数据结构的栈和队列的学习过程中,除了需要了解栈、队列的基本特点外,需要掌握包括创建、出栈入栈、出队入队等基本操作。并熟悉一些常见的应用问题,比如球钟问题就是一个典型利用栈和队列实现的实际问题。本文描述球钟问题的具体实现过程。球钟是一个利用球的移动来记录时间的简单装置.它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器.若分钟指示器中有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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值