Problem Description
refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多。当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先
进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆。现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道,
Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场)。假设便道内的车辆不超过1000000.
Input
输入为多组数据,每组数据首先输入N和M(0< n,m <200000),接下来输入M条命令。
Output
输入结束后,如果出现停车场内无车辆而出现Del或者便道内无车辆而出现Out,则输出Error,否则输出停车场内的车辆,最后进入的最先输出,无车辆不输出。
Example Input
2 6 Add 18353364208 Add 18353365550 Add 18353365558 Add 18353365559 Del Out
Example Output
18353365558 18353364208
Hint
Author
#include <stdio.h> #include <stdlib.h> #include <string.h> #define stackmax 10000 #define stacknum 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define true 1 #define false 0 typedef int status; typedef long long int selemtype; typedef long long int qelemtype; typedef struct { selemtype *base; selemtype *top; int stacksize; } sqstack; typedef struct queue//结点定义 { qelemtype data; struct queue *next; } qneue,*queueptr; typedef struct { queueptr front;//队头指针 queueptr rear;//队尾指针 } linkqueue; int initstack(sqstack &S,int n)//构造一个空栈 { S.base=new selemtype[n]; if(!S.base) exit(OVERFLOW); S.top=S.base; return OK; } int push(sqstack &S,selemtype e) { /*if(S.top-S.base>=S.stacksize) { S.base=(selemtype *)realloc(S.base,(S.stacksize+stacknum)*sizeof(selemtype)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=stacknum; }*/ *(S.top)=e; S.top++; return OK; } int pop(sqstack &S,selemtype &e) { if(S.base==S.top) return ERROR; e=*--S.top; return OK; } status isempty(sqstack S) { if(S.base==S.top) return true; else return false; } status initqueue(linkqueue &Q) { Q.front=Q.rear=new queue; if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; return OK; } status enqueue(linkqueue &Q,qelemtype e) { queueptr p=new queue; if(!p) exit(OVERFLOW); p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; } status dequeue(linkqueue &Q,qelemtype &e)//用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 qempty(linkqueue Q) { if(Q.rear==Q.front) return true; else return false; } int main() { int m,n;//n为栈的容量 while(~scanf("%d %d",&n,&m)) { sqstack S; initstack(S,n);//n为栈的容量!!栈的容量是规定的 linkqueue Q; initqueue(Q); bool flag=false; selemtype e; char s[10]; long long int num; while(m--) { scanf("%s",s);//空格即为结束此字符串的输入 if(strcmp(s,"Add")==0) { scanf("%lld",&num); if(S.top-S.base<n)//有剩余车位。判断栈满。n为栈的容量 { push(S,num); } else { enqueue(Q,num); } } else if(strcmp(s,"Del")==0) { if(isempty(S)) { flag=true; } else { pop(S,e); if(!qempty(Q)) { qelemtype temp; dequeue(Q,temp); push(S,temp); } } } else if(strcmp(s,"Out")==0) { if(qempty(Q)) { flag=true; } qelemtype temp; dequeue(Q,temp); } } if(flag) printf("Error\n"); else { while(!isempty(S))//if还是while的区别 { pop(S,e); printf("%lld\n",e); } } } }