问题
【问题描述】
设停车场是一个可停放”辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满”辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开人;当停车场内某辆车要离开时,在它之后进人的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进人车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
【基本要求】
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读人的输人数据序列进行模拟管理。每一组输人数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输人数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
【测试数据】
设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’表示到达(Arrival);‘D’
表示离去(Departure);'E’表示输人结束(End)。
【实现提示】
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储的结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
实现思路
主函数内:{
停车场
临时车道
候补队列
输入信息
判断(A )
执行:
1、判断(满)
候补队列入队
2、判断(非满)
停车场入栈
判断(D)
执行:
1、入栈临时栈
2、出栈停车场
3、出栈临时栈,返回停车场
4、候补队列首位入栈停车场
5、候补队列更新
判断(E)
执行:
退出程序
判断(其他数值)
执行:
异常报错
}
代码如下
一、自定义头文件内容:
//test.h
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define A 1
#define D 2
#define E EOF
#define OK 1
#define FALSE -1
#define TURE 1
#define ERROR -1
#define INFEASIBLE -1
typedef int Status;
typedef int ElemType;
二、结构体变量声明
typedef struct CarLnode//定义车辆类型
typedef struct CarList//停车栈
typedef struct Car_Que //等待停车队列
typedef struct SwapList //临时栈,为离开车辆让出位置
三、函数声明
//1、初始化
Status InitCarList(CarList &L, int n,double m) //初始化停车场
Status InitQueList(Car_Que &L) //初始化等待队列
Status InitSwapList(SwapList &L, int n) //初始化临时停车道
//2、插入
void InsertQueList(Car_Que &L, CarLnode* car) //尾插入等待队列队列
int InsertCarList(CarList &L, Car_Que &L2, CarLnode *car, int time1)//进入停车场
int InsertSwapList(CarList &L1, SwapList &L2,CarLnode car) //将不离开的车辆移入临时停车道
void InsertSwapList_TurnBack(SwapList &L1, CarList &L2) //将临时车道内的车放回停车场
//3、移动车辆
void DeleteQue(Que &L1) //剩余车辆前移
void DeleteList(CarList &L1, SwapList L2, Que L3, CarLnode car) //离开停车场
//4、判断车辆动作
int Charge(char n)
//5、查看当前停车场使用情况
void Visit(CarList L1, Car_Que L2,int time)
四、完整代码
#include "pch.h"
#include"test.h"
typedef struct CarLnode {//定义车辆类型
int num;
int time1;//驶入时间
int time2;//离开时间
CarLnode *next;
}CarLnode;
typedef struct CarList{//停车栈
int size;//停车场大小
double change;//停车场收费标准
int length;//停车数量
CarLnode *carlist;
}CarList;
typedef struct Car_Que {//等待停车队列
CarLnode *rear;
CarLnode *carlist;
}Que;
typedef struct SwapList {//临时栈,为离开车辆让出位置
int length;//剩余车辆数量
CarLnode *carlist;
}SwapList;
//1、初始化
Status InitCarList(CarList &L, int n,double m) {//初始化停车场
L.carlist = (CarLnode *)malloc(sizeof(CarLnode)*n);
L.size = n;
L.length = 0;
L.change = m;
return 0;
}
Status InitQueList(Car_Que &L) {//初始化等待队列
L.carlist = (CarLnode*)malloc(sizeof(CarLnode));
L.carlist->next = NULL;
L.rear = L.carlist;
return 0;
}
Status InitSwapList(SwapList &L, int n) {//初始化临时停车道
L.carlist = (CarLnode *)malloc(sizeof(CarLnode)*n);
L.length = 0;
return 0;
}
//2、插入
void InsertQueList(Car_Que &L, CarLnode* car) {//尾插入等待队列队列
car->next = L.rear->next;
L.rear->next = car;
L.rear = car;
//从右往左勾连
}
int InsertCarList(CarList &L, Car_Que &L2, CarLnode *car, int time1) {//进入停车场
if (L.length == L.size) {//无空闲车位即进入等待队列
InsertQueList(L2, car);//将car插入等待队列L2
cout << "车位已满" << car->num << "号车进入等待队列" << endl;//输出提示信息
return 0;
}
else {
L.carlist[L.length] = *car;//将car插入停车场L的第length+1处
L.length++;//长度加一
car->time1 = time1;//记录停放时间
cout << "时间为第" <<time1 << "分钟时" << car->num << "号车驶入停车场"
<< L.length << "号车位" << endl;//输出提示信息
return L.length;
}
}
int InsertSwapList(CarList &L1, SwapList &L2,CarLnode car) {//将不离开的车辆移入临时停车道
int i = L1.length-1;//获取最后一辆车的下标
int j = 0;//临时车道的第一个下标
int num;//需要将第num+1辆车开出
for (j; j < L1.length; j++) {//获取num
if (L1.carlist[j].num == car.num)
{
num = j;
break;
}
if (j == L1.length - 1) {//异常:停车场内没有输入车辆,输出提示信息
cout << "没有检查到该车辆信息" << endl;
return -1;
}
}
j = 0;
while (i>num)
{//将停车场中的车辆从第i+1到第num辆导入到临时车道中
L2.carlist[j] = L1.carlist[i];
j++; L2.length++;
i--; L1.length--;
}
return num;
}
void InsertSwapList_TurnBack(SwapList &L1, CarList &L2) {//将临时车道内的车放回停车场
int i = L1.length - 1;
int j = 0;
while (i >= 0)
{//将临时车道中的车辆从第num到第1辆导入到停车场中
L2.carlist[j] = L1.carlist[i];
j++; L2.length++;
i--; L1.length--;
}
}
//3、移动车辆
void DeleteQue(Que &L1) {//剩余车辆前移
CarLnode *p=L1.carlist->next;
L1.carlist->next = L1.carlist->next->next;
p->next = NULL;
}
void DeleteList(CarList &L1, SwapList L2, Que L3, CarLnode car) {//离开停车场
int a=InsertSwapList(L1, L2, car);//为离开车辆让位
if (a == -1) {//异常情况
cout << "请重新输入" << endl;
}
else {//计费,出停车场、等待队列第一位车辆进入停车场
cout << car.num<< "号车在第" << car.time2 << "分钟时离开停车场" << endl;
double money = (car.time2 - L1.carlist[a].time1)*L1.change; //计算停车费用
cout << car.num << "号车停车费用为:" << money << "元" << endl;
//停车场内车辆数减一
L1.length--;
//将让路车辆放回停车场
InsertSwapList_TurnBack(L2, L1);
//判断等待队列是否为空
if (L3.carlist->next != NULL) {//当等待队列非空时,将队列的第一个车辆放入停车场
InsertCarList(L1, L3, L3.carlist->next, car.time2);
DeleteQue(L3);//将队列前移
}
}
}
//4、判断车辆动作
int Charge(char n) {
if (n == 'A') return 1;//车辆停入停车场
else if (n == 'D') return 2;//车辆离开停车场
else if (n == 'V') return 3;//查看停车场和等待队列
else if (n == 'E') return 0;//退出系统
else {//异常提示
cout << "请按格式输入!" << endl;
return 4;
}
}
//5、查看当前停车场使用情况
void Visit(CarList L1, Car_Que L2,int time) {
for (int i = 0; i < L1.length; i++)
{
cout << "第" << i + 1 << "个停车位为" << L1.carlist[i].num << "号车,已经停放" << time - L1.carlist[i].time1 << "分钟" << endl;
}
cout << "停车场空闲车位有:" << L1.size - L1.length << "个" << endl;
CarLnode *p = L2.carlist->next;
if (p == NULL)
cout << "目前无车辆排队" << endl;
else {
int j = 1;
do{
cout << "等待队列第" << j << "位车为:" << p->num << "号车" << endl;;
j++;
p = p->next;
} while (!(p == NULL));
}
}
int main()
{
//定义停车场、临时车道、等待队列
CarList L1;
SwapList L2;
Car_Que L3;
int size, change;//停车场规模、收费标准
int a;//接受函数返回值
cout << "请输入停车场大小和收费标准(元)" << endl;
cin >> size >> change;
cout << "温馨提示:" << endl
<< "1、本停车场每10分钟收费: " << change
<< " 元 不足10分钟按10分钟计算" << endl
<< "2、查看目前停车场使用情况和排队情况请输入\"V\"和时间" << endl;
//初始化停车场、临时车道、等待队列
InitCarList(L1,size,change);
InitSwapList(L2, size-1);
InitQueList(L3);
//判断车辆动作
char Action;
cout << "请输入停车信息(格式:(动作,车牌,时间)):" << endl;
//创建数组存放每次输入的car
CarLnode car[100];
//每次输入一组数据,i++
int i = 0;
while (cin>>Action)//控制运行
switch (Charge(Action)) {//判断车辆动作
case 1://进入停车场
cin >> car[i].num >> car[i].time1;
a=InsertCarList(L1, L3,&car[i],car[i].time1);//插入停车栈,栈满调用插入队列函数,进入等待队列
i++;
break;
case 2://离开停车场
cin >> car[i].num >> car[i].time2;
DeleteList(L1, L2, L3, car[i]);
i++;
break;
case 3:
int time;
cin >> time;
Visit(L1, L3,time);//查看停车场情况
case 4:
continue;//输入异常时,提示错误,并继续运行
case 0:
exit(0);
}
return 0;
}