停车场管理
十四、停车场管理[问题描述]:
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等待,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
[基本要求]:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
//停车场管理系统
//车辆可以看成是一个节点,设计成一个结构体
typedef struct node
{
char num; //车牌号
Time reach;//车辆到达的时间
Time leave; //车辆离开的时间
}carNode;
//时间,栈,队列的定义
typedef struct Time
{
int hour ;
int min;
}Time;
//停车场内用栈来维护,因为先进去的要让后面的先出去才可以出去,符合栈的先进后出的特点
typedef struct NODE
{
carNode *stack;
int top;
}sqStackCar;
//便道上车辆的表示
typedef struct car
{
carNode *data;
struct car *next;
}QueueCar;
typedef struct Node
{
QueueCar *head;
QueueCar *rear;
}LinkQueue;
//初始化停车场中的栈
void InitStack(sqStackCar *s)
{
int i;
s->top = 0;
for(i = 0; i<=MAX ; i++)
s->stack = null;
}
//初始化一个队列,此队列是在当停车场满的时候在外面等待的队列
int InitQueue(QueueCar *Q)
{
Q->head = (QueueCar*)malloc(sizeof(QueueCar));
if(Q->head)
{
Q->head->next = null;
Q->rear = Q->head;
return 1;
}
else
return 0;
}
//打印收费 其中room是停车的位置
void PRINT(carNode *p , int room )
{
int A1 , A2 , B1 ,B2;
printf("\n车辆离开的时间!")
scanf("%d %d",&(p->leave.hour),&(p->leave.min));
printf("\请输入该车的车牌号!")
puts(p->num);
printf("\n到达的时间");
printf("%d %d",(p->reach.hour),(p->reach.min));
printf("%d %d",(p->leave.hour),(p->leave.min));
A1 =p->reach.hour;
A2 =p->reach.min;
B1 =p->leave.hour;
B2 =p->leave.min;
printf("\n应该收%d元",(B1-A1)*60+(B2-A2)*1);
free(p);
}
int Arrival(seqStackCar * s , LinkQueue * q)
{
carNode *p ;
QueueCar *t;
p = (carNode*)malloc(sizeof(carNode));
flushall(); //清除缓冲区
printf("\n请输入车辆的车牌号!");
puts(p->num);
if(s->top<MAX)
{
s->top++;
printf("\n车辆在停车场的%d位置",s->top);
printf("\n输入车辆到达的时间");
scanf("%d %d",&(p->reach.hour),&(p->reach.min));
s->stack = p ;
return 1;
}
else
{
printf("\n停车场已经满,请在旁边等待");
t = (QueueCar*)malloc(sizeof(QueueCar));
t->data = p ;
t->next = null;
q->rear->next =t ;
q->rear = t ;
return 1 ;
}
}
void Leave(seqStackCar *s , seqStackCar *temp , LinkQueue * L)
{
int room //离开的车辆的位置
carNode *p , *t ;
QueueCar * q ;
if(s->top >0)
{
while (1)
{
printf("\n请输入车辆的停车位置:%d",s->top);
scanf("%d",&room);
if(room>=1 && room <s->top) break;
else
{
printf("\n输入有误,请重新输入!");
}
}
while(s->top > room)
{
Temp->top++;
Temp->stack=s->stack;
s->stack=NULL;
s->top--;
}
p=s->stack; //把要删除的车辆节点赋给p。
s->stack=NULL;
s->top--;
while(temp->top >= 1)
{
s->top ++;
s->stack = temp->stack;
temp -> stack = null ;
temp -> top--;
}
PRINT(p , room);
if((L->head != L->rear) && s->top <MAX )
{
q = L ->head ->next ;
t = q -> data ;
s -> top ++ ;
printf("\n便道的%s号车进入车场第%d位置.",t->num,s->top);
scanf("%d:%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==L->rear)
L->rear=L->head;
s->stack=t;
free(q);
}
}
}
void List1(sqStackCar *S) //显示停车场里面的车辆信息
{
int i;
if(S->top > 0)
{
printf("\n车场");
printf("\n 位置 到达时间 车牌号 \n");
for(i = 1 ;i<S->top ; i++)
{
printf("%d",i);
printf("%d %d",S->stack->reach.hour,S->stack->reach.min );
puts(S->stack->num);
}
}
else
printf("停车场没有车");
}
//显示停车便道上的停车情况
void List2(LinkQueue *q )
{
QueueCar *p ;
int i ;
p = q->head->next;
if(q->head != q->rear)
{
printf("等待车辆的号码为:");
for(i = 1 ; p!=null ; i++)
{
printf("\n第%d车辆.",i);
puts(p->data->num);
p=p->next;
}
}
else
{
printf("\n过道里面没有等待的车辆");
}
}
我弄了一点,后面的有测试的什么的,你看看自己写。 看看,,,,,,,,,,, じO-联合 发表于 2014-3-10 12:27 static/image/common/back.gif
//停车场管理系统
//车辆可以看成是一个节点,设计成一个结构体
typedef struct node
好厉害啊,,,,,,,我研究研究。。。谢谢大神 芒芒 发表于 2014-3-15 12:23 static/image/common/back.gif
好厉害啊,,,,,,,我研究研究。。。谢谢大神
我可不是大神。。。。看看吧,后面就没写了 好强大!!! :sad算法才是程序的灵魂{:1_1:} {:1_1:} 鼓励一下楼主 鼓励一下楼主 支持楼主!德玛西亚! :sad
页:
[1]