记录数据结构实验课——停车场
题目
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出,汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端.最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的边道上等候,一旦有车离开,则排在边道上的第一辆车即可开入停车场。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进人车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳停车费用。
- 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的数据列进行模拟管理
- 每一组输入的数据都包含三个数据项:汽车“到达”或“离去”信息、汽车牌照以及到达或离去的时间。对每一组输入的数据进行操作后输出信息为:若是车辆到达。则输出汽车在停车场或者便道的位置;若是车辆离去,则输出汽车在停车场停留的时间和需要缴纳的费用(在便道上停留的时间不收费)。
- 栈以顺序结构实现,队列以链表结构实现。
思路
1.输入容量大小,确定顺序栈的容量
2.输入数据,若是进栈,则分为进停车场还是过道,也就是,入栈还是入队列。停车场没满就进,满了入队列。
3.若是离开,可能是停车场离开也可能是过道,通过辅助栈,判断是否在栈内,在,则弹出。
4.弹出后,若队列有车,则进栈,注意要更新入栈时间。就是前车出栈时间。
5.若在过道,则找到,remove。不用交钱。
代码
#include<iostream>
#define perfee 10;
using namespace std;
typedef struct Car{
int num;
int arrive;
int out;
}Car,*pCar;
typedef struct Park{
pCar capacity;
int size;
int top;
}Park,*pPark;
typedef struct RoadNode{
pCar data;
struct RoadNode* next;
}RNode,*pRNode;
int tccfull(pPark tcc){
if(tcc->top==tcc->size-1){
return 1;
}
else{
return 0;
}
}
int countfee(pPark tcc,int time){
tcc->capacity[tcc->top].out = time;
int fee = (tcc->capacity[tcc->top].out - tcc->capacity[tcc->top].arrive)*perfee;
return fee;
}
Car Pop(pPark tcc){
tcc->top--;
return tcc->capacity[tcc->top+1];
}
void Push(pPark tcc,Car car){
tcc->top++;
tcc->capacity[tcc->top] = car;
}
void insertroad(pRNode* roadrear,pRNode p){
p->next = (*roadrear)->next;
(*roadrear)->next = p;
(*roadrear) = p;
}
int main(){
int n;
int roadloc = 0;
char io;int num;int time;
int fee;
cout << "input the capacity of the park:";
cin >> n;
pPark tcc = new Park;
tcc->capacity = new Car[n];
tcc->top = -1;
tcc->size = n;
pPark assist = new Park;
assist->capacity = new Car[n];
assist->top = -1;
assist->size = n;
pRNode roadhead = new RNode;
roadhead->next = NULL;
pRNode roadrear = roadhead;
cout<<"input the io,num,time:";
while(cin >> io >> num >> time){
if(io=='a'){//新建一个
pRNode p = new RNode;
p->data = new Car;
p->data->num = num;
p->data->arrive = time;
if(tccfull(tcc)){//如果停车场满了,进入road
insertroad(&roadrear,p);
roadloc++;
cout << "road location:" << roadloc << endl;
}
else{//没满进入停车场
Push(tcc,*(p->data));
cout << "park location:" << tcc->top+1 << endl;
}
}
else if(io=='d'){//不是第一个则借助辅助离开,离开一个进入一个,离开时间就是进入时间
while(tcc->capacity[tcc->top].num!=num&&tcc->top!=-1){
Push(assist,Pop(tcc));
}
if(tcc->top!=-1){//该车之前进入停车场
fee = countfee(tcc,time);
cout << "park time:" << tcc->capacity[tcc->top].out - tcc->capacity[tcc->top].arrive << endl;
cout << "park fee:" << fee << endl;
Pop(tcc);
}
else{//没有进入停车场,在road中,不用付费,并删除
pRNode p = roadhead;//记录离开的前一个
while(p->next->data->num!=num){
p = p->next;
}
p->next->data->out = time;
fee = 0;
cout << "park time:" << p->next->data->out - p->next->data->arrive << endl;
cout << "park fee" << fee << endl;
pRNode q = p->next;
p->next = p->next->next;
delete q;
roadloc--;
}
while(assist->top!=-1){//辅助栈中的车回到停车场
Push(tcc,Pop(assist));
}
if(roadhead->next!=NULL&&!tccfull(tcc)){//tcc如果离开了一个,road中的车进入停车场
roadhead->next->data->arrive = time;
cout<<"new time:"<<roadhead->next->data->num <<' '<<roadhead->next->data->arrive<<endl;
Push(tcc,*(roadhead->next->data));
cout<<"top num:"<<tcc->capacity[tcc->top].num<<endl;
pRNode p = roadhead->next;
roadhead->next = roadhead->next->next;
delete p;
roadloc--;
//修改进入时间
}
}
cout<<"input the io,num,time:";
}
}
运行结果
- a为进入,d为离开,
- 第一个数字为车标,第二个数字为进去出去的时间
- new time指的是更新时间的车标和更新的时间值
- top num指的是 目前top的车标