停车场2.1

在2.0的基础上增加了停车可自由选择空位的功能,其他不变
定义一个全局数组 BOOL car_state[SIZE] = {FALSE}; //FALSE为空位,TRUE为有车
没有这个数组一样可以用display函数找出空位,但是显示与判断的过程运行效率较低,而且会暴露其他车辆的停车号,不符合实际。

新的parkin函数

void Parkin(Park *pa)
{
	if(NULL == pa)
		return;
	
	static int temp_number = 1000;	//初始停车号
	BOOL jud = FALSE;			//用来判断是否有空位,有空位TRUE,无空位FALSE
	
	Data data;					//要停的车
	data.number = temp_number+1;	//分配停车号
	temp_number++;
	
	system("clear");
	
	int i;
	for(i = 0; i < SIZE; i++)		//先遍历一遍看有无空位
	{
		if(car_state[i] == FALSE)
		{
			jud = TRUE;				//如果有空位,jud置TRUE
		}
	}
	
	if(jud == TRUE)
	{
		while(1)
		{
			printf("\t可选择的车位有:\n");
			for(i = 0; i < SIZE; i++)
			{
				if(car_state[i] == FALSE)
				{
					printf("\t%-4d\n", i+1);
				}
			}
		
			int newid;
			printf("\t请输入要停的车位号:");
			scanf("%d", &newid);
			
			if(car_state[newid-1] == TRUE)
			{
				printf("\t该车位已有车,请重新选择\n");
			}
			else
			{
				while(SeqGetTop(pa->seqs).id != newid)
				{
					LinkPush(pa->links, SeqGetTop(pa->seqs));
					SeqPop(pa->seqs);
				}
				
				data.id = SeqGetTop(pa->seqs).id;	//此时停车栈栈顶为空位,获取栈顶元素的车位号
				time_t now;
				time(&now);
				data.time = *localtime(&now);	//获取停入时间
				data.state = TRUE;				//状态改为已停
				SeqPop(pa->seqs);				//栈顶空位出栈
				SeqPush(pa->seqs, data);		//data压入栈顶
				
				printf("\t已为您自动分配停车号:%d\n", data.number);
				printf("\t停车成功\n");
				car_state[newid-1] = TRUE;
				break;
			}
		}		//while(1)
	}
	else		//if(jud == FALSE)
	{
		QueuePush(pa->q, data);			//无空位则压入等候队列
		printf("\t已为您自动分配停车号:%d\n", data.number);
		printf("\t车位已满,进入等候队列,当前还有%d辆车在您前面排队,请耐心等待\n", data.number - QueueGetTop(pa->q).number);
	}
	
	while(!LinkEmpty(pa->links))	//将让车栈元素循环压回停车栈
	{
		SeqPush(pa->seqs, LinkGetTop(pa->links));
		LinkPop(pa->links);
	}
	
}

新的leave函数,实际上只增加了一行car_state[tempid-1] = FALSE;

void Leave(Park *pa)
{
	if(NULL == pa)
	{
		return ;
	}
	
	int num;	//要离开的停车号
	
	
	system("clear");
	Display(pa);		//离开前先打印所有车
	printf("\n");
	printf("\t请输入要离开的停车号:");
	scanf("%d", &num);
	
	while(1)
	{
		
		if(SeqEmpty(pa->seqs))	//停车栈的车出完仍未匹配到num
		{
			printf("\t未找到该停车号\n");
			break;
		}
		
		//不停将栈顶车号与num匹配,同时出停车栈进入让车栈
		if(SeqGetTop(pa->seqs).number != num)	//如果当前停车栈顶不匹配
		{
			LinkPush(pa->links, SeqGetTop(pa->seqs));	//停车栈栈顶元素压入让车栈
			SeqPop(pa->seqs);							//停车栈栈顶出栈
		}
		else	//匹配到出去的车
		{
			time_t now;
			time(&now);
			struct tm outime = *localtime(&now);	//离开时间
			int hour = (outime.tm_hour)-(SeqGetTop(pa->seqs).time.tm_hour);
			int min = (outime.tm_min)-(SeqGetTop(pa->seqs).time.tm_min);
			int sec = (outime.tm_sec)-(SeqGetTop(pa->seqs).time.tm_sec);
			int money = hour*3600 + min*60 + sec*1;	//计费
			
			if(sec < 0)
			{
				sec += 60;
				min--;
			}
			
			if(min < 0)
			{
				min += 60;
				hour--;
			}
				
			printf("\t停车总时长为:%d小时%d分钟%d秒\n", hour, min, sec);
			printf("\t收您停车费共%d元\n", money);
			printf("\t停车号%d离开成功\n", num);
			
			int tempid = SeqGetTop(pa->seqs).id; //记录出车的车位号
			if(!QueueEmpty(pa->q))			//如果等候队列不为空
			{
				Data temp;						//停入等候队列头部车辆temp
				
				temp.number = QueueGetTop(pa->q).number; //队列首位车辆的停车号赋值给temp
				
				temp.id = SeqGetTop(pa->seqs).id;	//车位号赋值
				
				time_t now;
				time(&now);
				temp.time = *localtime(&now);	//获取停入时间
				
				temp.state = TRUE;				//状态为已停
				
				SeqPop(pa->seqs);				//停车栈栈顶出栈,并退出循环
				SeqPush(pa->seqs, temp);		//temp压入停车栈
				QueuePop(pa->q);				//等候队列队头出队列
				
				printf("\t等候队列中的首辆车已进入腾出的空位\n");
			}
			else		//等候队列为空,压入空位
			{
				Data empty = Espace(tempid);	//创建一个空车位
				SeqPop(pa->seqs);				//栈顶出栈
				SeqPush(pa->seqs, empty);		//当前位置压入空车位
			}
			car_state[tempid-1] = FALSE;		/*****新增*****/
			
			break;
		}
	}
	
	while(!LinkEmpty(pa->links))	//让车栈栈顶循环压回停车栈
	{
		SeqPush(pa->seqs, LinkGetTop(pa->links));
		LinkPop(pa->links);
	}
	
}
    原文作者:停车场模拟问题
    原文地址: https://blog.csdn.net/zoujiemax/article/details/85012431
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞