在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);
}
}