题目描述
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。试为停车场编制按上述要求进行管理的模拟程序。以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;当车辆将要离去时,若车在停车场内,模拟输出汽车出入情况并输出汽车在停车场内停留的时间,若车在便道上,直接输出汽车在停车场内停留的时间:0。栈以顺序存储结构实现,队列以链表结构实现。
输入要求
第一行输入一个整数n:代表停车场最多可以停放n辆汽车。(1<=n<=100)
接下来输入一个整数q:代表有q个信息。(1<=q<=200)
每一个信息,输入三个数据项:汽车到达(“arrive”)或汽车离去(“leave”),汽车的id,以及到达或离去的时间点t。(0<=t<=10000,id只含数字和字母,1<=strlen(id)<=10)
数据保证:到达的汽车不会已经在停车场或便道,离开的汽车一定在停车场或便道,且q个信息的时间点t升序。
输出要求
对于每一个信息输出一行:
汽车是到达(“arrive”):如果在便道上输出字符串"Queue",如果在停车场内输出字符串"Stack",并输出所在的位置,栈底的元素是第一个位置,队首的元素是第一个位置(字符串和位置用空格隔开)。
汽车是离开(“leave”):如果在停车场内,以"汽车id"+":"+"in或者out"模拟输出汽车的移动情况,再输出停留在停车场的时间(忽略让路的时间);如果在便道上,直接输出汽车在停车场内停留的时间:0。
1、定义三个全局变量n:停车场可以停放的车辆,In_count:进栈的序号, En_Queue:入队的序号
int n;
int In_count = 1;
int En_Queue = 1;
2、定义栈、队列、以及Car类型的结构体
typedef struct Car {
char id[10];
int In_time;
int Out_time;
}Car;
typedef struct {
Car *base;
Car *top;
int length;
}Stack;
typedef struct QNode {
Car data;
QNode *next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
3、初始化栈和队列
void InitStack(Stack &s) {
s.base = new Car[n];
s.top = s.base;
s.length = n;
}
void InitQueue(LinkQueue &Q) {
Q.front = Q.rear = new QNode;
Q.front->next = NULL;
}
4、创建入队和出队函数
void EnQueue(LinkQueue &Q, Car e) {
//入队
cout << "Queue " << En_Queue++ << endl;
QNode *p = new QNode;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
void DeQueue(LinkQueue &Q, Car e) {
//出队
En_Queue--;
QNode *p = new QNode;
p = Q.front;
while (p->next&&strcmp(e.id, p->next->data.id) != 0)
{
p = p->next;
}
QNode *d = new QNode;
d = p->next;
p->next = d->next;
if (Q.rear == d)
Q.rear = Q.front;
}
5、创建入栈和倒栈以及出栈函数
void Push(Stack &s, Car e) {//入栈
*s.top++ = e;
}
void Pop_Daozhan(Stack &s, Car &e) {
if (s.top == s.base)
return;
e = *--s.top;
}
void Pop(Stack &s, LinkQueue &Q, Car e) {//出栈
//肯定有出队加入栈
In_count--;
Stack p;
InitStack(p);
Car a;
Car *b;
b = s.top;
b--;
while (strcmp(e.id, b->id) != 0)
{
b--;
Pop_Daozhan(s, a);
cout << a.id << ":out ";
Push(p, a);
}
a = *--s.top;
int out = e.Out_time;
int cha = e.Out_time - a.In_time;
//输出a的数据
cout << a.id << ":out ";
while (p.top != p.base)
{
Pop_Daozhan(p, a);
cout << a.id << ":in ";
Push(s, a);
}
if (Q.front == Q.rear&&Q.front->next == NULL) {
cout << cha << endl;
return;
}
else {
QNode *m = new QNode;
En_Queue--;
m = Q.front->next;
cout << m->data.id << ":in ";
cout << cha << endl;
m->data.In_time = out;
Push(s, m->data);
In_count++;
Q.front->next = m->next;
if (Q.rear == m) {
Q.rear = Q.front;
}
delete m;
}
}
6、创建一个”来车“的方法,其中先判断栈是否满,如果栈不满则入栈,负责入队。
void In_Car(Stack &s, LinkQueue &Q, Car e) {
//判断栈是否满
if (s.top - s.base < s.length) {
cout << "Stack " << In_count++ << endl;
Push(s, e);
}
else
EnQueue(Q, e);
}
7、创建一个”出车“的方法,先遍历队列中是否有这辆车,如果有,则出队,否则就出栈。
void Out_Car(Stack &s, LinkQueue &Q, Car e) {
QNode *p = new QNode;
p = Q.front->next;
while (p != NULL&&strcmp(e.id, p->data.id) != 0)
{
p = p->next;
}
if (p) {
DeQueue(Q, e);
cout << '0' << endl;
}
else {
Pop(s, Q, e);
}
}
8、最后定义main方法执行
int main() {
int m, Time;
Stack S;
LinkQueue Q;
Car e;
cin >> n >> m;
char type[10], id[10];
InitStack(S);
InitQueue(Q);
for (int i = 0; i < m; i++) {
cin >> type >> id >> Time;
strcpy(e.id, id);
if (strcmp(type, "arrive") == 0) {
e.In_time = Time;
In_Car(S, Q, e);
}
else {
//出对或出栈
e.Out_time = Time;
Out_Car(S, Q, e);
}
}
return 0;
}