#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <malloc.h>
#define ERROR 0
#define OK 1
#define NULL 0
typedef struct node{
int passport;
int time;
}node;
typedef struct stack{
node *base;
node *top;
int stacksize;
}stack;
typedef struct Qnode{
node Qdata;
struct Qnode *next;
}Qnode;
typedef struct {
Qnode *front;
Qnode *rear;
}LinkQueue;
int count=0;
int times;
stack s,temp;
LinkQueue Q;
void initstack(stack &S,int n){
S.base=(node *)malloc(n*sizeof(node));
S.top=S.base;
S.stacksize=n;
}
void EnQueue(LinkQueue &Q,node e);
void DeQueue(LinkQueue &Q,node &e);
void push(stack &S,node e){
if((S.top-S.base)>=S.stacksize){EnQueue(Q,e);}
else {
S.top->passport=e.passport;
S.top->time=e.time;
S.top++;
}
}
int pop(stack &S,node &e){
if(S.top==S.base)return ERROR;
--S.top;
e.passport=S.top->passport;
e.time=S.top->time;
return OK;
}
void wait(stack &S){
if((S.top-S.base)==(S.stacksize-1)&&count!=0){
node temp;
DeQueue(Q,temp);
temp.time=times;
push(S,temp);
}
}
void EnQueue(LinkQueue &Q,node e){
Qnode *q;
q=(Qnode *)malloc(sizeof(Qnode));
q->Qdata.passport=e.passport;
q->Qdata.time=e.time;
q->next=NULL;
if(count==0){Q.front=q;count++;}
Q.rear->next=q;
Q.rear=q;
}
void DeQueue(LinkQueue &Q,node &e){
if(Q.rear==NULL){}
else {
e.passport=Q.front->Qdata.passport;
e.time=Q.front->Qdata.time;
Q.front=Q.front->next;
if(Q.front==NULL){Q.rear=Q.front;count=0;}
}
}
int main(){
int n,exit;
float money;
char info;
int pass;
Q.front=NULL;
Q.rear=(Qnode *)malloc(sizeof(Qnode));
Q.rear->next=Q.rear;
printf("欢迎使用停车场管理系统\n本停车场容量为:");
cin>>n;
initstack(s,n);
initstack(temp,n);
printf("停车场费率为:");
cin>>money;
while(exit!=OK){
printf("\n请输入车辆数据\nA到达 D离去 E结束:");
cin>>info;
if(info=='E'){return 0;}
printf("请输入车辆牌照号码:");
cin>>pass;
if(info=='A')printf("请输入车辆进场时间:");
if(info=='D')printf("请输入车辆离场时间:");
cin>>times;
if(info=='A'){
int i,j;
node a;
a.passport=pass;
a.time=times;
push(s,a);
for(i=1;i<=n;i++){
if(s.base[i-1].passport==a.passport){
printf("停车位置(停车场内):%d\n",i);
}
}
Qnode *tp;
tp=Q.front;
if(tp==NULL){}
else{
j=1;
while(tp!=Q.rear){
tp=tp->next;
j++;
}
printf("停车位置(便道):%d\n",j);
}
}
else if(info=='D'){
node d;
int tp,counter=0;
do{
counter++;
tp=pop(s,d);
while(tp!=ERROR){
if(d.passport==pass){
float m;
m=(times-d.time)*money;
printf("停留时间:%d分钟 您需交费:%2.2f元\n",times-d.time,m);
while(temp.base!=temp.top){
pop(temp,d);
push(s,d);
}
wait(s);
d.passport=9999;
tp=ERROR;
}
else{
push(temp,d);
d.passport=0;
tp=ERROR;
}
}
}while(d.passport==0||counter>n);
}
else if(info!='E'){}
}
}