关于停车计费系统的几个问题

停车厂管理问题

[问题描述]
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。

[测试数据]
设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。

[基本要求]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。

[实现提示]
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。

实现中遇到的问题:
建立一个基本类Elem存放车的信息(时间和车牌),在栈和数组中设置Elem的元素,存放基本信息。
class类型重定义问题,在排头加入#pragma once即可。
在实现enqueue函数时遇到rear无法正确更改问题,源代码如下:

void enqueue(Elem car)
{
Qnode p(car.carnum, car.time);
rear->next=&p;
rear = rear->next;
size++;
}

后来发现是因为p没有建新结点,在car中输入会改变Q里面rear的值。
将其改为:

void enqueue(Elem E)
{
rear->next=new Qnode(E.carnum, E.time);
rear = rear->next;
size++;
}

已经实现了车辆的进入。

车辆进出函数如下:

void carin(Queue &Q, Cstack &S, Elem car)
{
int flag = 0;
for (int i = 0; i < S.top; i++)//在停车场中查找是否存在
{
if (car.carnum == S.Carnum[i].carnum)
{
cout << "该车号在停车场中已存在,请重新输入!" << endl;
flag = 1;
break;
}
}
if (flag == 0 && Q.front != Q.rear)  //在停车场中不存在,在便道里查找
{
Qnode *temp=Q.front->next;
while (temp&&temp->Qelem.carnum!=car.carnum)
{
temp = temp->next;
}
while (temp&&temp->Qelem.carnum == car.carnum)
{
flag = 1;
cout << "该车在车道里已存在,请重新输入!" << endl;
break;
}
}
if (flag==0)  //均不存在,让车进入
{
if (S.top == S.maxSize)//车库已满,在便道等待
{
Q.enqueue(car);
cout << "请在通道"<<Q.lenth()<<"等待" << endl;
}
else{ //停入车库
S.push(car);
cout << "请进入停车场" << S.lenth() << "号车位!" << endl;
}
}
}


void leavecar(Queue &Q, Cstack &S, Elem car)
{
int flag = 0,i=0;
Elem t;
while (car.carnum != S.Carnum[i].carnum) //在停车场中寻找车辆
{ 
if (i >= S.top)
{
cout << "在车库里未找到该车" << endl;
flag = 1;
break;
}
i++;
}
if (flag == 1) //未找到该车在便道里寻找
{
if (Q.size == 0)flag = 2;
Queue *temp = new Queue;
while (Q.size != 0 && Q.front->next->Qelem.carnum != car.carnum)
{
t = Q.dequeue();
temp->enqueue(t);
if (Q.size == 0)
{
cout << "未在车道里找到车辆" << endl;
flag = 2;
break;
}
}
if (flag == 1)
{
t = Q.dequeue();
cout << "车在车道里第" << temp->size + 1 << "位,已开出。"<<endl;
while (temp->size != 0)
{
t = temp->dequeue();
Q.enqueue(t);
}
}
}
if (flag == 2)
{
cout << "车辆输入有误。" << endl;
}


if (flag == 0)
{
Cstack *temp = new Cstack;
int m = S.top -1 ;
while (S.Carnum[m].carnum != car.carnum)
{
t = S.pop();
temp->push(t);
m--;
}
t = S.pop();
if (car.time > t.time)
{
cout << "尾号为" << car.carnum << "的车已经开出。" << endl;
cout << "停车用时:" << car.time - t.time << endl;
}
else { cout << "输入错误" <<endl; S.push(t); }
while (temp->top!=0)
{
t = temp->pop();
S.push(t);
}
if (S.top != S.maxSize && Q.size != 0)
{
t = Q.dequeue();
t.time = car.time;//进入车库后更新时间
S.push(t);
cout << "等待车辆" << t.carnum << "开入车库" << endl;
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值