问题描述:
设停车场是一个可停放n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆达到时间的先后顺序,依次由北向南排列(大门在最南端,最先达到的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退车车场为它让路,待赶辆车开出大门外,其它车辆在按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及达到或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆达到、则输出汽车在停车场内或便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
测试数据
例如,设n=2,输入数据为(“A”,1,5), (“A”,2,10), (“D”,1, 15), (“A”,3,20), (“A”,4,25), (“D”,2, 35), (“E”,0,0), 其中:“A”表示达到(Arrival);“D”表示离去(Departure); “E”表示输入结束(End)。
实现提示:
需另设一个栈,临时停放 为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按达到或离去的时刻有序。栈中每个元素表示一辆汽车,包括两个数据项:汽车的牌照号码和进入停车场的时刻。
实验要求:任选一种高级程序语言编写源程序,并调试通过,测试正确。
copy老师的模板函数,其余的在主函数实现,可能还有bug
应注意保留一些非常有用的复用性高的模板,方便下次使用
#include
using namespace std;
#define ERROR 0
#define OVERFLOW -2
#define OK 1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define PRESENT_STACK_SIZE 2
typedef struct
{
int number;
int time;
}Car;
typedef int Status;
typedef Car ElemType;
typedef Car QElemType;
typedef struct
{
ElemType* base; //栈底指针
ElemType* top; //栈顶指针
int stacksize;
} SqStack;
typedef struct Qnode
{
QElemType data;
struct Qnode* next;
}Qnode, * QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
} LinkQueue;
Status InitStack(SqStack& S, int n1)
{
S.base = (ElemType*)malloc(n1 * sizeof(ElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = n1;
return OK;
}
Status Push(SqStack& S, ElemType e)
{
if (S.top - S.base < S.stacksize)
{
cout << "停车成功,当前位置:" << S.top-1 << endl;
*S.top = e;
S.top++;
return OK;
}
else
{
cout << "停车场已满!" << endl;
return ERROR;
}
}
Status isfull(SqStack& S)
{
return (S.top - S.base >= S.stacksize);
}
Status isfull1(SqStack& S)
{
return (S.top - S.base > S.stacksize);
}
Status Pop(SqStack& S, ElemType& e)
{
if (S.top == S.base) return ERROR; //空栈
S.top--;
e = *S.top;
return OK;
}
Status GetTop(SqStack S, ElemType& e)
{
if (S.top == S.base) return ERROR;//空栈
e = *(S.top - 1);
return OK;
}
Status StackEmpty(SqStack S)
{
return (S.top == S.base);
}
Status InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(Qnode));
if (!Q.front) exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status DeQueue(LinkQueue& Q, QElemType& e)
{
if (Q.front == Q.rear) return ERROR;
QueuePtr P = Q.front->next;
e = P->data;
Q.front->next = P->next;
if (Q.rear == P) Q.rear = Q.front;
free(P);
return OK;
}
Status EnQueue(LinkQueue& Q, QElemType e)
{
QueuePtr P = (QueuePtr)malloc(sizeof(Qnode));
if (!P) exit(OVERFLOW);
P->data = e;
P->next = NULL;
Q.rear->next = P;
Q.rear = P;
return OK;
}
Status QueueEmpty(LinkQueue& Q)
{
return (Q.front == Q.rear);
}
void ShowStack(SqStack& S)
{
if (!StackEmpty(S)) {
Car* p = S.top;
cout << "*********停车场***********\n";
for (p--; p != S.base-1; p--)
{
cout << "车牌号:" << p->number << " 停车位:" << p << endl;
}
cout << "==========================\n";
}
}
void ShowQueue(LinkQueue& Q)
{
if (!QueueEmpty(Q)) {
Qnode* p = Q.front->next;
cout << "*********便 道*********\n";
while (p != NULL)
{
cout << "车牌号:" << p->data.number << " 便道位置:" << p << endl;
p = p->next;
}
cout << "=======================\n";
}
}
int main()
{
char condition;
int num, time;
SqStack ParkingLot, ReturnParking;
LinkQueue WaitLane;
InitQueue(WaitLane);
InitStack(ParkingLot,PRESENT_STACK_SIZE);
InitStack(ReturnParking,STACK_INIT_SIZE);
cout << "停车费每小时2美元!\n";
cout << "输入测试数据:";
cin >> condition;
while (condition!='E')
{
cin >> num >> time;
if (condition == 'A')
{
Car tmp;
tmp.number = num;
tmp.time = time;
if (!Push(ParkingLot, tmp) || isfull1(ParkingLot) )
{
EnQueue(WaitLane, tmp);
}
}
else if (condition == 'D')
{
Car* p = ParkingLot.top;
while (p->number!=num&&p>=ParkingLot.base)
{
p--;
}
if (p < ParkingLot.base)
{
cout << "该车辆不存在!\n";
cout << "输入测试数据:";
cin >> condition;
continue;
}
Car* q = ParkingLot.top;
Car tmp,mmp;
if ((ParkingLot.top - 1)->number != num)
{
cout << "有车辆退出中!\n";
for (q--; q > p; q--)
{
Pop(ParkingLot, tmp);
cout << "车牌号:" << tmp.number<<" ";
Push(ReturnParking, tmp);
}
cout << "成功退出车辆!\n";
}
Pop(ParkingLot, mmp);
cout << "离开车辆的车牌号:" << mmp.number << " 到达时间:" << mmp.time << " 离开时间:"
<< time << " 停留时间:" << abs(mmp.time - time) << " 停车费:" << abs(time - mmp.time) * 2 << "$" << endl;
if (!isfull(ParkingLot))
{
while (!isfull(ParkingLot) && !StackEmpty(ReturnParking))
{
Car tmpc;
Pop(ReturnParking, tmpc);
cout << "车牌号:" << tmpc.number << " ";
Push(ParkingLot, tmpc);
}
cout << "车辆已返回停车场!\n";
}
if (!isfull(ParkingLot))
{
while (!isfull(ParkingLot) && !QueueEmpty(WaitLane))
{
Car tmpc;
DeQueue(WaitLane, tmpc);
Push(ParkingLot, tmpc);
}
}
}
ShowStack(ParkingLot);
cout << endl;
ShowQueue(WaitLane);
cout << "输入测试数据:";
cin >> condition;
}
cout << "停车费每小时2美元!\n";
cout << "刘建睿 2021102527";
return 0;
}