早教吧 育儿知识 作业答案 考试题库 百科 知识分享

设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端

题目详情
设停车场内只有一个可停放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’表示输入结束。
【实现提示】需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
▼优质解答
答案和解析
void PopStack(CarStack *garage, CarStack *Temp, LinkQueue *road, InputData *inputdata)//车出库
{
CarNode *Car = (CarNode *)malloc(sizeof(CarNode));
if (!Car)
{
cout << "内存分配失败!" << endl;
exit(0);
}
Car->num = inputdata->num;
Car->leave = inputdata->t;
int i = garage->top;
while (i)
{
if (garage->stack[i -1 ]->num != Car->num)
{
garage->top--;//进临时车站
Temp->stack[Temp->top] = garage->stack[garage->top];
Temp->top++;

i--;//没有找到,继续循环查找
if (i == 0)
{
cout << "没有该车牌的车!" << endl;
}
}
else//获得车辆信息,并回归临时车栈的车辆
{
Car->reach = garage->stack[i -1 ]->reach;
Print(Car);//打印车辆收费单
garage->top--;
while (Temp->top>0)//回归临时车站的车辆
{
Temp->top--;
garage->stack[garage->top] = Temp->stack[Temp->top];
garage->top++;
}
if (road->head != road->rear)//从便道出来一辆车到停车场
{
garage->stack[garage->top] = road->head->next;
cout << endl;
cout << "车场有空位,便道第一辆车可以进入!" << endl;
garage->top++;
road->head = road->head->next;
}
i = 0;//已经找到,退出循环
}
}
}

void InfoStack(CarStack *garage)//车库车辆信息
{
if (garage->top ==0 )
cout << "车库里没有车!" << endl;
else
{
cout << " _________________________ " << endl;
cout << "| |" << endl;
cout << "| 车 库 |" << endl;
cout << "|位置 车辆号码 到达时间|" << endl;
for (int i = 0; itop; i++)
{
cout << "| " << i +1 << " " << garage->stack[i]->num << " " << garage->stack[i]->reach << " |" << endl;
}
cout << "|_________________________|" << endl;
}
}

void InfoQueue(LinkQueue *road)//便道车辆信息
{
CarNode *p;
p = road->head->next;
int i = 0;
if (road->head == road->rear)
cout << "便道里没有车!" << endl;
else
{
cout << " __________________ " << endl;
cout << "| |" << endl;
cout << "| 便道 |" << endl;
cout << "| 位置 车辆号码 |" << endl;
while (p != NULL)
{
cout << "| " << ++i << " " << p->num << " |" << endl;
p = p->next;
}
cout << "|__________________|" << endl;
}
free(p);
}

void Print(CarNode *Car)//打印出站车辆信息
{
int rh, lh;
float t;
rh = Car->reach;
lh = Car->leave;
t = (lh - rh) * 60 *0.01 ;
cout << " ---------------------------------------------------- " << endl;
cout << "| 车辆的号码 进库时间 离开时间 车费(元) |" << endl;
cout << "| " << Car->num << " " << rh << " " << lh << " " << t << " |" << endl;
cout << "|____________________________________________________|" << endl;
}

void Input(InputData *inputdata)
{

int maxsize;
cout << "请输入停车场容量 Maxsize (最多为5) : ";
do
{
cin >> maxsize;
if (!(maxsize<5 && maxsize>0))
{
cout << "输入有误,请重新输入停车场容量:";
}

} while (!(maxsize<5 && maxsize>0));

int i = 0, j =0 , k =1 ;
char c;
int n;
CarStack garage, Temp;
LinkQueue road;
CarNode car;
InitStack(&garage, maxsize);
InitStack(&Temp, maxsize);
InitQueue(&road);

while (k)
{
i = 0;
while (!i)
{
cout << " ____________________________________________________________" << endl;
cout << "| |" << endl;
cout << "| 欢迎光临停车场,本停车场每分钟收费元 |" << endl;
cout << "| |" << endl;
cout << "| 请输入车库命令,格式如下(命令,车牌号,入库时间) |" << endl;
cout << "| |" << endl;
cout << "| A(a)-入库 D(d)-离开 P(p)-查看停车场车辆 P(p)-查看过道车辆 |" << endl;
cout << "|____________________________________________________________|" << endl;

cin >> (inputdata->command) >> (inputdata->num) >> (inputdata->t);

c = inputdata->command;
n = inputdata->num;

if (c != 'A'&&c != 'a'&&c != 'D'&&c != 'd'&&c != 'W'&&c != 'w'&&c != 'P'&&c != 'p'&&c != 'E'&&c != 'e')
{
cout << "命令不正确,请重新输入!" << endl;
i =0 ;
}
else
i = 1;
// if(SearchInGarage(garage,n,maxsize)&&SearchInRoad(road,n))
// {
// i =0 ;
// cout< // }

}
switch (c)
{
case 'A':
case 'a':
GetCarNode(&garage, &road, inputdata, maxsize);//获取车辆信息
break;
case 'D':
case 'd':
PopStack(&garage, &Temp, &road, inputdata);//车出库
break;
case 'P':
case 'p'://查询停车场的信息
InfoStack(&garage);//车库车辆信息
break;
case 'W':
case 'w'://查询侯车场的信息
InfoQueue(&road);//便道车辆信息
break;
case 'E':
case 'e':
k =0 ;
break;
default:
break;
}
}
cout << endl;
cin.clear();
}

bool SearchInGarage(CarStack garage, int n, int maxsize)//a表示要查找的车牌号,如果在停车场里面,就返回true
{
bool tag = false;
for (int i =0 ; i {
if (n == garage.stack[i]->num)
{
tag = true;
break;
}
}
return tag;
}

bool SearchInRoad(LinkQueue road, int n)//a表示要查找的车牌号,如果在通道里面,就返回true
{
bool tag = false;
StackNode *p;
p = (StackNode *)malloc(sizeof(StackNode));
if (road.head != road.rear)//如果队列非空
{
p = road.head;
while (p != road.rear)
{
++p;
if (p->num == n)
tag = true;
}//退出此while循环时p指向最后一个元素
}
free(p);
return tag;
}
看了 设停车场内只有一个可停放n辆...的网友还看了以下:

两个男孩儿各骑一辆自行车,从相距20英里的两个地方,开始沿直线相向骑行.在他们起步的同时.一辆自行车  2020-03-30 …

一道应用题一辆汽车从甲地开往乙地,如果每小时行50千米,可提前3小时到达.一辆汽车从甲地开往乙地,  2020-05-24 …

一辆客车从甲城开往乙城,8小时到达,一辆货车从乙城开往甲城,10小时到达,两车同时由两城相向开出,  2020-06-05 …

一辆货车从A城到B城,需6小时到达;一辆客车从B城到A城,需8小时到达.两车同时从AB两城分别开出  2020-07-08 …

一辆汽车从甲地开往乙地,如果速度提高20%可以提前一小时到达.一辆汽车从甲地开往乙地,如果速度提高  2020-07-20 …

模拟公交车一天内运行的情况某公共汽车站每隔30分钟到达一辆汽车,但可能有0-3分钟的误差,此误差的  2020-08-04 …

解决实际问题:一辆大客车可乘坐46人,一辆列车可乘坐的人数是这辆大客车的37倍.(1)这列火车一共可  2020-11-03 …

一个数学题,我女儿的一辆车以15km/h的速度离开洛杉矶直达纽约,另一辆车以20km/h的速度从纽约  2020-11-06 …

小李每天开车上班,通过一天单行路后,还需7分钟到达单位,通常,单行路每分钟可通过15辆车,一天小李到  2020-11-28 …

以下是一段DNA序列(编码链),请找出这段序列中的几个功能位点以下是一段DNA序列(编码链).这段序  2020-12-05 …