/*停车场管理
问题描述:停车场是一个能放n辆车的狭长通道,
只有一个大门,汽车按到达的先后次序停放。
若停车场满了,车要停在门外的便道上等候,
一旦有车走,则便道上第一辆车进入。当停车场中的
车离开时,由于通道窄,在它后面的车要先退出,
待它走后依次进入。汽车离开时按停放时间收费。
基本功能要求:
1.建立三个数据结构分别是:停车栈,让路栈,等候队列。
2.输入数据模拟管理过程,数据(入或出,车号)
基本思路:创建一个链式停车栈,一个链式让车栈,一个顺序队列。
结构体中存放停车号,车位号。
有车进入,若有车位直接进停车栈,若无车位,先在等候队列取号等候
当有车离开时,先将要离开车的前面的车入让车栈,将要离开车放到栈顶
然后弹出,然后将让车栈的车重新进入停车栈,此时若有等候车辆,
等候车辆进入停车栈。
相关功能函数:
Stack *s:停车栈
Queue *q:等候队列
Wstack *w:让车栈
Node *p:结构体,存放停车相关信息
void Init(Stack *s);//初始化停车栈
void QInit(Queue *q);//初始化候车队列
void WInit(Wstack *w);//初始化让车栈
BOOL Full(Stack *s);//判断停车栈是否满了
Node *GetWTop(Wstack *w);//获取让车栈栈顶元素
Node *GetTop(Stack *s);//获取停车栈栈顶元素
Node* GetQue(Queue *q);//获取队列元素
void Park(Stack *s,Queue *q);//进入停车栈
void Push_Wpark(Wstack *w,Node *p);//入让车栈
void Push_Queue(Queue *q,int wait);//进入等候队列
BOOL Empty(Stack *s);//判断停车栈是否为空
BOOL WEmpty(Wstack *w);//判断让车栈是否为空
BOOL QEmpty(Queue *q);//判断队列是否为空
void Leave_Park(Stack *s,Wstack *w,Queue *q);//离开停车场
int wait :等候号
Stack* Create();//创建停车栈
Wstack* CreateW();//创建让车栈
Queue *CreateQ();//创建候车队列
void showpark(Stack *s,Queue *q);//显示停车栈信息
time_t pass:之前的时间
void TimeOut(time_t pass);//显示停车时间
void Pop(Stack *s);//弹出停车栈元素
void PopW(Wstack *w);//弹出让车栈元素
void QPop(Queue *q);//弹出队列
遇到问题:
1.时间显示和计算时间差(百度)
2.一开始用的时间计算方式不知为何导致车辆离开时弹出停车栈出现段错误。
3.车辆离开时,若未找到匹配停车号时的程序一直段错误
相关程序:
***while((s->par->id)!=leaveid)//循环将栈内元素的ID与输入ID进行比较
{
Node *tmp = GetTop(s);
Push_Wpark(w,tmp);
Pop(s);
if(s->par == NULL)//停车栈内元素全部进入让车栈
{
break;
}
}
if(s->par == NULL )//未找到匹配的停车号
{
printf("未找到!\n");
while(WEmpty(w)==FALSE)//让车栈的车辆全部回停车栈
{
Node *tmp2 = GetWTop(w);
pushpark(s,tmp2->id,tmp2->t,tmp2->num);
PopW(w);
}
return ;
}
未解决前"***"位置是这么写的while((s->par->id)!=leaveid&&s->par!=NULL)
想法是 将停车栈的停车号依次与输入离开停车号ID进行比对,当找到ID或者直到停车栈内元素全部弹出也没找到时
退出循环,结果当输入一个不正确的停车号时一直段错误,后经热心朝阳群众帮助,发现,当找不到时,栈内元素全部被弹出,
到最后一次循环时s->par == NULL,而此时已经不存在s->par->id 所以出现段错误,后将"***"位置改成上述写法,解决了该问题。
小结:
很好的锻炼了对链表队列栈的使用,巩固了相关知识,加强了自己解决BUG的能力。
头文件:
#ifndef _STACK_H_
#define _STACK_H_
#define SIZE 10
#include <time.h>
typedef int DATA;
typedef enum{FALSE,TRUE,ERROR}BOOL;
struct _node//停车信息
{
DATA id;//