// 停车场管理系统#include<stdio.h>#include<stdlib.h> #defineOVERFLOW 0 #define ERROR0 #define OK 1 #defineSTACKSIZE 2 /车/ 库容量// 时间节点typedef struct time{int hour; int min;}Time;// 车辆信息typedef struct{char CarNum; float time;int pos_a; // 车在停车场中的位置int pos_b; // 车在便道上的位置int flag;}Car,Car2;// 车库信息 (顺序栈) typedef struct{Car *top; Car *base; int stacksize;}SqStack;// 初始化int InitStack(SqStack &S){S.base=new Car[STACKSIZE]; if(!S.base)exit(OVERFLOW); S.top=S.base;S.stacksize=STACKSIZE; return OK;}// 判空int StackEmpty(SqStackS){ if(S.top==S.base) return OK; else return ERROR;// 判满int StackFull(SqStack S){ if(S.top-S.base>=S.stacksize) return OK; else return ERROR;}// 入栈int Push(SqStack &S,Car e){ if(S.top-S.base==S.stacksize) return ERROR; *S.top++=e;return OK;}// 出栈int Pop(SqStack &S,Car &e){ if(S.top==S.base) return ERROR;e=*--S.top; return OK;}// 遍历栈int StackTraverse(SqStack S) {Car *p=S.top;Car *q=S.base;int l=1;if(StackEmpty(S)){for(int j=1;j<=STACKSIZE;j++){ printf("\t 车牌:");printf("\t\t 到达时间:");printf("\t 位置%d:空空",j); printf("\n");}return OK;}while(p!=q){Car car=*(q);printf("\t 车牌: %d",car.CarNum); printf("\t\t 到达时间: %5.2f",car.time); printf("\t\t 位置: %d",l++);printf("\n");q++;return OK;}// 备用车道 (顺序栈) typedef struct {Car2 *top2;Car2 *base2; // int stacksize2;}SqStack2;int InitStack2(SqStack2 &S2){ S2.base2=newCar2[STACKSIZE]; if(!S2.top2) exit(OVERFLOW); //S2.top2=S2.base2;S2.stacksize2=STACKSIZE; return OK;}// 判空int StackEmpty2(SqStack2 S2){ if(S2.top2==S2.base2) return OK; else return ERROR;}// 进栈int Push2(SqStack2 &S2,Car2 e2){ if(S2.top2-S2.base2==STACKSIZE) return ERROR; *S2.top2++=e2;return OK;}// 出栈int Pop2(SqStack2 &S2,Car2 &e2){ if(S2.top2==S2.base2) return ERROR; e2=*--S2.top2; return OK;}// 车道信息(链队) typedef struct QNode{Car data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;// 初始化int InitQueue(LinkQueue &Q){ Q.front=Q.rear=new QNode;Q.front->next=NULL; return OK;}// 进队int EnQueue(LinkQueue &Q,Car e){ QueuePtr p;p=new QNode; p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p; return OK;}int QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear) return OK;else return ERROR;}// 出队int DeQueue(LinkQueue &Q,Car &e){ QueuePtr p;if(Q.front==Q.rear) return ERROR; p=Q.front->next;e=p->data;Q.front->next=p->next;delete p;return OK;}// 主函数int main(){int i=1;int j=1;int status; float time,money;LinkQueue Q;Car car_I,car_D,car_M;SqStack S;SqStack2 S2;InitStack(S);InitStack2(S2);InitQueue(Q);while(1){printf("\t\t\t 欢迎来到XXX停车场!\n”);printf(" **************************************************************** *\n" );printf("\t\t\t1-- 车辆到达停车场\n");printf("\t\t\t2-- 车辆离开停车场\n");printf("\t\t\t3-- 停车场存放车辆情况\n");printf("\t\t\t0-- 退出程序\n");printf(" **************************************************************** *\n" );printf(" 选择(0-3):\n");scanf("%d",&status) ;if(status==1){printf("\t 请输入车牌号:");scanf("%d",&car_I.CarNum);printf("\t 请输入车到达的时间:");scanf("%f",&car_I.time);if(!StackFull(S)){Push(S,car_I); // 车进入车库car_I.pos_a=i;car_I.flag=1;i=i+1;for(int m=1;m<50;m++) // 边线printf("--");printf("\n");printf("\t 车牌号:"); printf("%d",car_I.CarNum);printf("\t 到达时间:"); printf("%5.1f\t",car_I.time);printf("\t 车库中的位置是:%d\n",car_I.pos_a);for(int m=1;m<50;m++) // 边线printf("--");printf("\n"); printf("\n"); printf("\n");}else{EnQueue(Q,car_I);car_I.pos_b=j;car_I.flag=0; //++j; printf("\n"); printf("\tSorry! 我们的车库已满!!!,您可以把车!!免费!! 停在车道上!\n");printf("\n");for(int m=1;m<50;m++) // 边线printf(".."); printf("\n");printf("\t 车牌号:");printf("%d",car_I.CarNum);printf("\t 便道上的位置为:for(int m=1;m<50;m++)printf(".."); printf("\n"); printf("\n"); printf("\n"); %d\n",car_I.pos_b); // 边线else if(status==2){车库里收取停车费;在便道上则免费)// 指令为2,开车离去(如果车在printf(" 请输入客户的车牌号:");scanf("%d",&car_D.CarNum);printf(" 请输入现在的时间:");scanf("%f",&car_D.time);i=i-1;int flag=0;// 判断车是否在便道上if(StackFull(S)){Car *p=S.top;Car *q=S.base;while(p!=q){Car car=*(q);if(car.CarNum!=car_D.CarNum){ flag++;} if(car.CarNum==car_D.CarNum){ goto loop;}q++;} //while if(flag>=STACKSIZE){printf(" 您的车停在便道上,所以免费!!!");}printf("\n");printf("\n");printf("\n");} //ifelse{loop:do{ // 挡在前面的车给要出去的车让路Pop(S,car_M);// 加一个判断,判断是不是停车场里的车if(car_D.CarNum!=car_M.CarNum){Push2(S2,car_M);}else{car_I.time=car_M.time;}}while(car_D.CarNum!=car_M.CarNum);while(!StackEmpty2(S2)){ // 让路的车返回去Pop2(S2,car_M);Push(S,car_M);}while(!QueueEmpty(Q)&&!StackFull(S)){if(!StackFull(S)){DeQueue(Q,car_M); // 便道上的车离开后进入停车场,那么后面的车的位置都得变。