问题描述:
设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。
基本要求:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费)。栈以顺序结构出现,队列以链表结构实现。
测试数据:
(1)连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、、JF005、JF006、JF007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。
(2)(1)中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF004的让路动作和JF006从便道到停车位上的动作。
(3)随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。
(4)程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。
// 停车场.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream>
using namespace std;
#include <string>
#define Max 3//停车场的最大数
#define N 10
#define x 2
#define y 1
typedef struct
{
char license[N];
double time1,time2;
}Car; //车辆信息
typedef struct
{
Car *park[Max];
int top;
}Parking; //停车场
typedef struct Node
{
Car *data;
struct Node *next;
}QNode; //链表结点
typedef struct
{
QNode *front,*rear;
}Pavement; //便道 链队列
Parking *Init_Parking() //顺序栈初始化
{
Parking *s;
s = new Parking;//申请栈空间
if(!s)
return NULL;//未申请到足够大的栈空间,返回空指针
else
{
s->top=-1;
return s; //申请到栈空间,返回栈空间地址
}
}
Pavement *Init_Pavement() //链队初始化
{
QNode *q;
Pavement *p;
q = new QNode; //申请首尾指针结点
p = new Pavement; //申请链队首结点
q->next=NULL;
p->front=p->rear=q;
return p;
}
void come_Car(Parking *pk,Pavement *pm){//进车
QNode *q;
q=new QNode;//申请新节点
Car *c;
c=new Car;
cout<<"请输入车牌号:";
cin>>c->license;
if(pk->top==Max-1){//停车场内的车辆已满
cout<<"停车场已满,请将车停在便道上"<<endl;
cout<<"请输入车辆车辆停在便道上的时间"<<'\t';
cin>>c->time1;
q->data=c;
q->next=NULL;
pm->rear->next=q;//将新节点插入队尾
pm->rear=q;//将尾指针指向新的节点
}
else{//停车场未满
cout<<"停车场未满,可将车辆停在停车场内"<<endl;
cout<<"请输入车辆进入停车场的时间"<<'\t';
cin>>c->time1;
pk->top++;//将栈顶指针向上移动
cout<<"车牌号为"<<c->license<<"的车停在停车场的第"<<pk->top+1<<"的位置上"<<endl;
pk->park[pk->top]=c;//将c置入新的栈顶
}
}
void leave_Car(Parking *pk,Parking *temp,Pavement *pm){//车辆离开停车场
int position,i;
double money1=0,money2=0;
char num[N];
Car *c1,*c2;
QNode *q;
if(pk->top>=0){//停车场里有车
cout<<"请输入要离开的汽车的车牌号"<<'\t';
cin>>num;
for(i=0;i<=pk->top;i++){//找要离开的车辆在停车场中的位置
if(strcmp(num,pk->park[i]->license)==0){
position=i;
break;
}
}
if(i>pk->top){//如果停车场内没有车牌号为num的车辆时
cout<<"您输入的车牌号有误,请重新输入!"<<'\t';
cin>>num;
for(i=0;i<=pk->top;i++){//找要离开的车辆在停车场中的位置
if(strcmp(num,pk->park[i]->license)==0){
position=i;
break;
}
}
}
cout<<"停在停车场的"<<position+1<<"位置上的车辆要离开"<<endl;
while(pk->top>position){//辅助栈
temp->top++;
temp->park[temp->top]=pk->park[pk->top];
cout<<"车牌号为:"<<pk->park[pk->top]->license<<"的车辆需要暂时退出停车场!"<<endl;
pk->park[pk->top]=NULL;
pk->top--;
}
c1=pk->park[pk->top];
cout<<"车牌号为:"<<c1->license<<"的车辆离开停车场!"<<endl;
cout<<"请输入此车离开停车场的时间"<<'\t';
cin>>c1->time2;
money2=money1+x*(c1->time2-c1->time1);
cout<<"该车需交费:"<<money2<<"元"<<endl;
pk->park[pk->top]=NULL;
pk->top--;
while(temp->top>=0){//辅助栈中有车辆
pk->top++;
pk->park[pk->top]=temp->park[temp->top];
cout<<"车牌号为:"<<pk->park[pk->top]->license<<"的车停回停车场的"<<position+1<<"的位置"<<endl;
temp->park[temp->top]=NULL;
temp->top--;
position++;
}
if((pm->front!=pm->rear)&&(pk->top<Max)){//便道上有车并且停车场内有空位时
q=pm->front->next;
c2=q->data;
pk->top++;
cout<<"便道上车牌号为"<<c2->license<<"的车进入停车场的"<<pk->top+1<<"的位置"<<endl;
c2->time1=c1->time2;//c1车离开停车场的时间等于c2车进入停车场的时间
money1=y*(c2->time2-c2->time1);
pm->front->next=q->next;
if(q==pm->rear)
pm->rear=pm->front;
pk->park[pk->top]=c2;
delete q;
}
else
cout<<"便道上没有车!"<<endl;
}
else
cout<<"停车场里没有车!"<<endl;
}
void pkdisplay(Parking *pk){//查询栈内信息
int i;
cout<<"停车场内的情况为:"<<endl;
if(pk->top>=0){//停车场内有车时
for(i=0;i<pk->top+1;i++){
cout<<"车位"<<i+1<<"的位置上停有车牌号为"<<pk->park[i]->license<<"的车辆"<<endl;
}
}
else
cout<<"此时停车场内没有车!"<<endl;
}
void pmdisplay(Pavement *pm){//查询便道内的情况
QNode *q;
q=pm->front->next;
int i=1;
cout<<"便道上的情况为:"<<endl;
if(pm->front!=pm->rear){//当便道上有车时
while(q!=NULL){
cout<<"位置"<<i<<"上停有车牌号为"<<q->data->license<<"的车辆"<<endl;
q=q->next;
i++;
}
}
else
cout<<"便道里没有车!"<<endl;
}
int main(int argc, char* argv[])
{
int n;
Parking *pk,*temp;
Pavement *pm;
pk=Init_Parking();
temp=Init_Parking();
pm=Init_Pavement();
while(1)
{
cout<<"******停车场模拟管理******"<<endl;
cout<<" 1、有车辆进入停车场 "<<endl;
cout<<" 2、有车辆出停车场 "<<endl;
cout<<" 3、查询停车场状态 "<<endl;
cout<<" 4、查询便道状态 "<<endl;
cout<<" 5、退出系统 "<<endl;
cout<<endl;
cout<<"请输入您的选择:";
cin>>n;
switch(n)
{
case 1:
come_Car(pk,pm);
cout<<endl;
break;
case 2:
leave_Car(pk,temp,pm);
cout<<endl;
break;
case 3:
pkdisplay(pk);
cout<<endl;
break;
case 4:
pmdisplay(pm);
cout<<endl;
break;
case 5:
cout<<"成功退出系统!"<<endl;
exit(0);
break;
default:
cout<<"您的输入有误,请重新输入!"<<endl;
break;
}
}
return 0;
}