Problem Description
refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多。当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先
进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆。现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道,
Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场)。假设便道内的车辆不超过1000000.
Input
输入为多组数据,每组数据首先输入N和M(0< n,m <200000),接下来输入M条命令。
Output
输入结束后,如果出现停车场内无车辆而出现Del或者便道内无车辆而出现Out,则输出Error,否则输出停车场内的车辆,最后进入的最先输出,无车辆不输出。
Sample Input
2 6
Add 18353364208
Add 18353365550
Add 18353365558
Add 18353365559
Del
Out
Sample Output
18353365558
18353364208
Hint
Source
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node // 数据结点
{
char num[20];
struct node* next;
} Node;
typedef struct // 栈
{
Node *top;
int len;
} seqstack;
typedef struct // 队列
{
Node *front;
Node *rear;
int len;
} seqqueue;
Node * new_node()
{
Node *p = (Node*)malloc(sizeof(Node));
p->next = NULL;
return p;
}
// 对栈的操作
seqstack* init_stack()
{
seqstack *s = (seqstack*)malloc(sizeof(seqstack));
s->top = new_node();
s->len = 0;
return s;
}
void push_stack(seqstack* s, char num[])
{
Node* p = new_node();
strcpy(p->num, num);
p->next = s->top->next;
s->top->next = p;
s->len++;
}
void pop_stack(seqstack* s)
{
Node* t = s->top->next;
s->top->next = s->top->next->next;
free(t);
s->len--;
}
void clear_stack(seqstack *s)
{
while (s->len != 0)
{
pop_stack(s);
}
}
// 对队列的操作
seqqueue* init_queue()
{
seqqueue *q = (seqqueue*)malloc(sizeof(seqqueue));
q->front = new_node();
q->rear = q->front;
q->len = 0;
return q;
}
void push_queue(seqqueue* q, char num[])
{
Node* p = new_node();
strcpy(p->num, num);
q->rear->next = p;
q->rear = p;
q->len++;
}
void pop_queue(seqqueue* q)
{
Node *t = q->front->next;
q->front->next = q->front->next->next;
free(t);
q->len--;
}
void clear_queue(seqqueue *q)
{
while(q->len > 0)
{
pop_queue(q);
}
}
void show(Node *p)
{
Node *t = p->next;
while(t)
{
printf("%s\n", t->num);
t = t->next;
}
}
int main()
{
int m, n;
char num[25];
char str[25];
seqstack *s;
seqqueue *q;
s = init_stack();
q = init_queue();
scanf("%d%d", &n, &m);
while(~scanf("%d %d", &n, &m))
{
int flag = 1;
clear_stack(s); // 新的一组数据需要清空栈和队列
clear_queue(q);
while(m--)
{
scanf("%s", str);
if (strcmp(str, "Add") == 0) // 栈没满则入栈,栈满则入队
{
scanf("%s", num);
if (s->len < n)
{
push_stack(s, num);
}
else
{
push_queue(q, num);
}
}
else if (strcmp(str, "Del") == 0) // 栈没空则出栈,队列中的车入栈;栈空则Error
{
if (s->len > 0)
{
pop_stack(s);
if (q->len > 0) // 需要判断队列是否为空,再能出队入栈
{
push_stack(s, q->front->next->num);
pop_queue(q);
}
}
else
{
flag = 0;
}
}
else if (strcmp(str, "Out") == 0) // 队列没空则出队;空则Error
{
if (q->len > 0)
{
pop_queue(q);
}
else
{
flag = 0;
}
}
}
if (flag == 1)
{
show(s->top);
}
else
{
printf("Error\n");
}
}
return 0;
}