【程序设计与实践】实验五:停车场管理
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门供车辆进出。
车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放(即最先到达的一辆车停放在停车场的最里面)。
如果停车场已放满n辆车,则以后到达的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车可以进入停车场。
停车场内如有某辆车要开走,则在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费,停留在便道上的车不收停车费。
编写程序对该停车场进行管理。
输入数据时,先输入一个整数n(n<=10),再输入若干组数据,每组数据包括3个数据项:汽车到达或离开的信息(A表示到达、D表示离开、E表示结束)、汽车号码、汽车到达或离开的时刻。当输入“E 0 0”时程序结束。
若有车辆到达,则输出该汽车的停车位置;若有车辆离开,则输出该汽车在停车场内停留的时间。
输入输出示例
3
A、1 1
1号车停入1号位
A、2 2
2号车停入2号位
A、3 3
3号车停入3号位
D、1 4
1号车出停车场,停留时间3
A、4 5
4号车停入3号位
A、5 6
5号车在便道上等待
D、4 7
4号车出停车场,停留时间2
5号车停入3号位
D、5 8
5号车出停车场,停留时间1
E 0 0
代码:
#include <bits/stdc++.h>
#define MAX 10
using namespace std;
int n=0,a=0,b=0;
typedef struct node{ //车辆信息结点
int no;
int reachtime;
}CarNode;
typedef struct tingchechang{ //停车场
CarNode *stack[MAX+1];
int top;
}SeqStackCar;
typedef struct car{ // 通道中车辆
CarNode *data;
struct car *next;
}QueueNode;
typedef struct tongdao{ //通道
QueueNode *head;
QueueNode *rear;
}LinkQueueCar;
void InitStack(SeqStackCar *);//初始化栈
void InitQueue(LinkQueueCar *);//初始化队列
int Reach(SeqStackCar *,LinkQueueCar *);
void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);
void zjm(){
printf("\n");
printf(" 程序设计与实践 实验(五)停车场管理\n");
printf("\n");
printf(" 停车场管理说明\n");
printf(" ======================== \n");
printf("\n");
printf("1.先输入总车位数n,再输入若干组数据\n");
printf("\n");
printf("2.每组数据包括3个数据项:汽车到达或离开的信息<A表示到达,D表示离开,E表示结束>\n");
printf("\n");
printf("3.3个数据项:汽车到达或离开的信息,汽车号码,汽车到达或离开的时刻\n");
printf("\n");
printf("4.当输入‘E 0 0’时程序结束\n");
printf("\n");
}
int main(){
zjm();
cout<<"请输入总车位数n:";
cin>>n;
cout<<endl;
char flag;
int i;
SeqStackCar Enter,Temp;//定义+初始化
LinkQueueCar Wait;
InitStack(&Enter);
InitStack(&Temp);
InitQueue(&Wait);
while(1){
cin>>flag>>a>>b;
if(flag=='A'){
i=Reach(&Enter,&Wait);
if(i==0){
cout<<"停车场已满!该车将进入等候通道!"<<endl;
}
else{
cout<<a<<"号车停入"<<i<<"号位"<<endl;
}
}
else if(flag=='D'){
Leave(&Enter,&Temp,&Wait);
}
else if(flag=='E'&&a==0&&b==0){
return 0;
}
}
}
void InitStack(SeqStackCar *s){//初始化栈
int i;
s->top=0;
for(i=0;i<MAX;i++){
s->stack[s->top]=NULL;
}
}
void InitQueue(LinkQueueCar *q){//初始化队列
q->head=(QueueNode *)malloc(sizeof(QueueNode));
q->head->next=NULL;
q->rear=q->head;
}
int Reach(SeqStackCar *E,LinkQueueCar *W){
CarNode *p;
QueueNode *q;
p=(CarNode *)malloc(sizeof(CarNode));//分配空间地址
p->no=a;//读入车辆号码
if(E->top<n){
E->top++;
p->reachtime=b;//读入到达时间
E->stack[E->top]=p;
return E->top;
}
else{
q=(QueueNode *)malloc(sizeof(QueueNode));
q->data=p;
q->next=NULL;
W->head->next=q;
W->rear=q;
return 0;
}
}
void Leave(SeqStackCar *E,SeqStackCar *T,LinkQueueCar *W){
CarNode *p,*t;
QueueNode *q;
if(E->top>0){
while(E->stack[E->top]->no!=a){//将目标车辆之后的车移入临时栈
T->top++;
T->stack[T->top]=E->stack[E->top];
E->stack[E->top]=NULL;
E->top--;
}
p=E->stack[E->top];//读入目标数据
E->stack[E->top]=NULL;
E->top--;
while(T->top>=1){//将临时栈重新移入停车场
E->top++;
E->stack[E->top]=T->stack[T->top];
T->stack[T->top]=NULL;
T->top--;
}
cout<<a<<"号车出停车场,停留时间"<<b-p->reachtime<<endl;
if((W->head!=W->rear)&&E->top<MAX){// 等候通道中的车辆进入停车场
q=W->head->next;
t=q->data;
E->top++;
printf("等候通道中的%d号车进入停车场的%d号位.",t->no,E->top);
t->reachtime=b;//记录进入停车场时间
W->head->next=q->next;//删除结点
if(q==W->rear) W->rear=W->head;//如果队列中只有一个结点
E->stack[E->top]=t;
free(q);
}
else{
cout<<"等候通道里没有车了。"<<endl;
}
}
else cout<<"停车场已经没有车了!"<<endl;
}