(c)(数据结构)栈与队列的应用--停车场管理
题目描述
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
-
- #define TRUE 1
- #define FALSE 0
- #define N 2
-
- typedef struct
- {
- char num[20];//车牌照号码
- int arriveh,arrivem,arrives;//到达的时分秒
- int leaveh,leavem,leaves;//离开的时分秒
- }CAR;
-
- typedef struct
- {
- CAR car[N];
- int top;
- }PARKING_STACK;
-
- typedef struct
- {
- CAR car[N];
- int front;
- int rear;
- }SIDEWALK_QUEUE;
-
- void InitStack(PARKING_STACK *stack)
- {
- stack->top=-1;
- }
-
- void InitQueue(SIDEWALK_QUEUE *queue)
- {
- queue->front=queue->rear=0;
- }
-
- int PushStack(PARKING_STACK *stack,CAR car)
- {
- if(stack->top==N)
- return FALSE;
- stack->car[++stack->top]=car;
- return TRUE;
- }
-
- CAR PopStack(PARKING_STACK *stack)
- {
- if(stack->top==-1)
- {
- printf("栈空
");
- return;
- }
- return stack->car[stack->top--];
- }
-
- int EnterQueue(SIDEWALK_QUEUE *queue,CAR car)
- {
- if((queue->rear+1)%%%%N==queue->front)
- return FALSE;
- queue->car[queue->rear]=car;
- queue->rear=(queue->rear+1)%%%%N;
- return TRUE;
- }
-
- CAR DeleteQueue(SIDEWALK_QUEUE *queue)
- {
- CAR car;
- if(queue->front==queue->rear)
- {
- printf("队列空
");
- return;
- }
- car=queue->car[queue->front];
- queue->front=(queue->front+1)%%%%N;
- return car;
- }
-
- void PrintCar(PARKING_STACK *stack,SIDEWALK_QUEUE *queue)
- {
- int i;
- printf("PARKING:
");
- for(i=0;i<=stack->top;i++)
- {
- printf("%%%%d %%%%s
",i+1,stack->car[i].num);
- }
- printf("SIDEWALK:
");
- for(i=queue->front;i!=queue->rear;i=(i+1)%%%%N)
- {
- printf("%%%%d %%%%s
",i+1,queue->car[i].num);
- }
- }
-
- void ExitParking(PARKING_STACK *stack,PARKING_STACK *side_stack,CAR car)
- {
- CAR leaveCar;
- int minute;
- for(;strcmp(stack->car[stack->top].num,car.num)!=0;)
- {
- PushStack(side_stack,PopStack(stack));
- }
- leaveCar=PopStack(stack);
- minute=(car.leaveh*60+car.leavem)-(leaveCar.arriveh*60+leaveCar.arrivem);
- printf("%%%%s已离开,共停留%%%%d分钟
",car.num,minute);
- for(;side_stack->top!=-1;)
- {
- PushStack(stack,PopStack(side_stack));
- }
- }
- int main()
- {
- int ch1,ch2;
- PARKING_STACK stack,side_stack;
- SIDEWALK_QUEUE queue;
- InitStack(&stack);
- InitStack(&side_stack);
- InitQueue(&queue);
- while(1)
- {
- CAR car;
- printf("请输入选项:
");
- printf("1:查看停车场和便道状态
");
- printf("2:管理汽车
");
- printf("3:exit
");printf("top:%%%%d
",stack.top);
- scanf("%%%%d",&ch1);
- switch(ch1)
- {
- case 1:
- PrintCar(&stack,&queue);
- break;
- case 2:
- printf("请输入到达还是离去(1或2),车牌号,以及对应时间(时 分 秒)
");
- scanf("%%%%d",&ch2);
- if(ch2==1)//到达
- {
- scanf("%%%%s %%%%d %%%%d %%%%d",car.num,&car.arriveh,&car.arrivem,&car.arrives);
- if(stack.top==N-1)//入队列
- {
- if(EnterQueue(&queue,car)==TRUE)
- printf("%%%%s成功入队!
",car.num);
- else
- printf("%%%%s未能入队!
",car.num);
- }
- else//能入停车场
- {
- if(PushStack(&stack,car)==TRUE)
- printf("%%%%s进入停车场!
",car.num);
- else
- printf("队满,%%%%s未能进停车场!
",car.num);
- }
- }
- if(ch2==2)
- {
- int flag=0;
- int i;
- scanf("%%%%s %%%%d %%%%d %%%%d",car.num,&car.leaveh,&car.leavem,&car.leaves);
- for(i=0;i<=stack.top;i++)
- {
- if(strcmp(car.num,stack.car[i].num)==0)
- {
- flag=1;
- break;
- }
- }
- if(!flag)
- {
- printf("查无此车!
");
- break;
- }
- ExitParking(&stack,&side_stack,car);
- if(queue.front!=queue.rear)
- {
- CAR car=DeleteQueue(&queue);
- PushStack(&stack,car);
- printf("%%%%s已进入停车场!
",car.num);
- }
- }
- break;
- case 3:
- exit(0);
- default:
- printf("input again!
");
- }
- }
- return 0;
- }
推荐阅读