自动停车场由一个可停放n 辆车的狭长通道构成,且只有一个入口可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设入口在最南端)。若停车场内已停满n 辆车,则后来的汽车需在入口外的临时等候便道上等候,当有车要离开时,临时等候便道上的第一辆车即可进入。当自动停车场内某辆车要离开时,必须先将在它之后
进入的车辆移出为其让路,待该辆车离开后,其他车辆再按原次序移入自动停车场。每辆车离开自动停车场时,应按其停留时间的长短交费(在临时等候便道上停留的时间不收费)。
//head.h
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define maxstacksize 4
#define maxqueuesize 5
struct Elem
{
char op;
char id[10];
int hour;
int minu;
};
struct Stack
{
Elem* base;
Elem* top;
int stacksize;
};
struct QNode
{
Elem data;
QNode* next;
};
struct Queue
{
QNode* Front;
QNode* Rear;
int queuesize;
};
void InitStack(Stack &s);
Elem GetTop(Stack s);
void push(Stack &s, Elem e);
Elem pop(Stack &s);
void InitQueue(Queue &q);
void EnQueue(Queue &q, Elem e);
Elem DeQueue(Queue &q);
int calculate_expense(Elem a, Elem b);
void solve(Stack s, Stack s2, Queue q);
#endif // HEAD_H_INCLUDED
//main.cpp
#include "head.h"
int main()
{
Stack s, s2;
Queue q;
freopen("in.txt", "r", stdin);
//freopen("out.txt","w", stdout);
InitStack(s);
InitStack(s2);
InitQueue(q);
printf("请输入需要进行的操作(L:离开,A:到达),您的车牌号及时间(时:分):\n\n");
solve(s, s2, q);
return 0;
}
//Solve.cpp
#include "head.h"
void solve(Stack s, Stack s2, Queue q)
{
char op; //进行的操作
char id[10]; //车牌号
int hour, minu; //时间:小时,分钟
while(scanf("%c %s %d:%d",&op, id, &hour, &minu) != EOF)
{
Elem car;
car.op = op;
strcpy(car.id, id);
car.hour = hour;
car.minu = minu;
if(op == 'A') //车辆到达
{
if(s.stacksize < maxstacksize) //停车场未满
{
push(s, car);
printf("您的汽车 %s 停于自动停车场第 %d 号位置\n",car.id, s.stacksize);
}
else
{
if(q.queuesize < maxqueuesize) //临时停车场未满
{
EnQueue(q, car);
printf("您的汽车 %s 停于临时停车场第 %d 号位置\n",car.id, q.queuesize);
}
else
printf("对不起,临时停车场已满\n");
}
}
else if(op == 'L') //车辆离开
{
while(1)
{
Elem e = GetTop(s);
if(strcmp(e.id, car.id) == 0)
{
pop(s);
printf("%s 应收取的费用为: %d\n",e.id ,calculate_expense(e, car));
break;
}
else
{
pop(s);
push(s2, e);
}
}
while(s2.stacksize != 0)
{
Elem e = GetTop(s2);
pop(s2);
push(s, e);
}
if(q.queuesize > 0)
{
Elem e = DeQueue(q);
e.hour = car.hour;
e.minu = car.minu;
push(s, e);
}
}
getchar();
}
return;
}
//Stack_Operation.cpp
#include "head.h"
void InitStack(Stack &s)
{
s.base = new Elem[maxstacksize];
s.top = s.base;
s.stacksize = 0;
}
Elem GetTop(Stack s)
{
return *(s.top - 1);
}
void push(Stack &s, Elem e)
{
*s.top++ = e;
s.stacksize ++;
}
Elem pop(Stack &s)
{
s.top --;
s.stacksize --;
return *s.top;
}
//Queue_Operation.cpp
#include "head.h"
void InitQueue(Queue &q)
{
q.Front = q.Rear = new QNode;
q.Front->next = NULL;
q.Rear->next = NULL;
q.queuesize = 0;
}
void EnQueue(Queue &q, Elem e)
{
QNode* p = new QNode;
p -> data = e;
p -> next = NULL;
q.Rear -> next = p;
q.Rear = p;
q.queuesize ++;
}
Elem DeQueue(Queue &q)
{
QNode* p = q.Front->next;
Elem e = p->data;
q.Front->next = p->next;
if(q.Rear == p)
q.Rear = q.Front;
delete p;
q.queuesize --;
return e;
}
//Calculate_Expense.cpp
#include "head.h"
int calculate_expense(Elem a, Elem b)
{
int hour1 = a.hour, hour2 = b.hour;
int min1 = a.minu, min2 = b.minu;
int ans = hour2*60+min2 - (hour1*60+min1);
return ans;
}
测试数据:
Input:
A 001 07:00
A 002 07:30
A 003 07:40
A 004 08:00
A 005 09:05
A 006 10:00
A 007 11:25
A 008 12:20
A 009 12:23
A 010 14:00
L 001 15:00
L 002 15:30
L 006 16:00
A 011 16:30
Output:
输入需要进行的操作(L:离开,A:到达),您的车牌号及时间(时:分):
您的汽车 001 停于自动停车场第 1 号位置
您的汽车 002 停于自动停车场第 2 号位置
您的汽车 003 停于自动停车场第 3 号位置
您的汽车 004 停于自动停车场第 4 号位置
您的汽车 005 停于临时停车场第 1 号位置
您的汽车 006 停于临时停车场第 2 号位置
您的汽车 007 停于临时停车场第 3 号位置
您的汽车 008 停于临时停车场第 4 号位置
您的汽车 009 停于临时停车场第 5 号位置
对不起,临时停车场已满
001 应收取的费用为: 480
002 应收取的费用为: 480
006 应收取的费用为: 30
您的汽车 011 停于临时停车场第 3 号位置