停车场管理
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1) 建立三个数据结构分别是:停放队列、让路栈、等候队列。
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1) 建立三个数据结构分别是:停放队列、让路栈、等候队列。
(2) 输入数据模拟管理过程,数据(入或出,车号)。
#ifndef __PARK_H__
#define __PARK_H__
#define TRUE 1
#define FALSE 0
#define SIZE 11
typedef struct _cardata
{
int id;
char num[20];
char name[10];
int time;
}CarData;
typedef struct _parkqueue
{
CarData data[SIZE];
int parkfront;
int parkrear;
}ParkQueue;
typedef struct _waitnode
{
CarData data;
struct _waitnode *next;
}WaitNode;
typedef struct _waitqueue
{
WaitNode *waitfront;
WaitNode *waitrear;
}WaitQueue;
typedef struct _stacknode
{
CarData data;
struct _stacknode *next;
}StackNode;
typedef struct _linkStack
{
StackNode *top;
}LinkStack;
int InitParkQueue(ParkQueue *parkq);
int ParkQueueFull(ParkQueue *parkq);
int ParkQueueEmpty (ParkQueue *parkq);
int EnParkQueue(ParkQueue *parkq,CarData x);
int DeParkQueue(ParkQueue *parkq,CarData *x);
WaitQueue* Create_Queue();
int WaitQueueEmpty(WaitQueue *waitq);
int EnWaitQueue(WaitQueue *waitq,CarData x);
int DeWaitQueue(WaitQueue *waitq,CarData *x);
LinkStack *Create_Stack();
int StackEmpty(LinkStack *s);
int Push(LinkStack *s,CarData x);
int Pop(LinkStack *s,CarData *x);
int park(ParkQueue *parkq,WaitQueue *waitq,CarData x);
void display(ParkQueue *parkq,WaitQueue *waitq);
void face();
#endif // __PARK_H__
#include "park.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int InitParkQueue(ParkQueue *parkq)
{
if(parkq == NULL)
return FALSE;
parkq->parkfront = 0;
parkq->parkrear = 0;
return TRUE;
}
int ParkQueueFull(ParkQueue *parkq)
{
if(parkq == NULL)
return FALSE;
return parkq->parkfront == (parkq->parkrear + 1) % SIZE;
}
int ParkQueueEmpty (ParkQueue *parkq)
{
if (parkq == NULL)
return FALSE;
return parkq->parkfront == parkq->parkrear;
}
int EnParkQueue(ParkQueue *parkq,CarData x)
{
if(parkq == NULL)
return FALSE;
if(ParkQueueFull(parkq))
return TRUE;
parkq->parkrear = (parkq->parkrear + 1) % SIZE;
parkq->data[parkq->parkrear] = x;
return TRUE;
}
int DeParkQueue(ParkQueue *parkq,CarData *x)
{
if (parkq == NULL)
return FALSE;
if (ParkQueueEmpty(parkq))
return FALSE;
parkq->parkfront = (parkq->parkfront + 1) % SIZE;
*x = parkq->data[parkq->parkfront];
return TRUE;
}
WaitQueue* Create_Queue()
{
WaitQueue * waitq = (WaitQueue*)malloc(sizeof(WaitQueue)/sizeof(char));
if (waitq == NULL)
return NULL;
waitq->waitfront = NULL;
waitq->waitrear = NULL;
return waitq;
}
int WaitQueueEmpty(WaitQueue *waitq)
{
if (waitq == NULL)
return FALSE;
return waitq->waitfront == NULL;
}
int EnWaitQueue(WaitQueue *waitq,CarData x)
{
if (waitq == NULL)
return FALSE;
WaitNode * waitnode = (WaitNode*)malloc(sizeof(WaitNode)/sizeof(char));
if (waitnode == NULL)
return FALSE;
waitnode->data = x;
waitnode->next = NULL;
if (waitq->waitfront == NULL)
{
waitq->waitfront = waitnode;
waitq->waitrear = waitnode;
}
else
{
waitq->waitrear->next = waitnode;
waitq->waitrear = waitnode;
}
return TRUE;
}
int DeWaitQueue(WaitQueue *waitq,CarData *x)
{
if (waitq == NULL)
return FALSE;
if (WaitQueueEmpty(waitq))
return FALSE;
WaitNode *p = waitq->waitfront;
*x = p->data;
waitq->waitfront = p->next;
free(p);
if (waitq->waitfront == NULL)
waitq->waitrear = NULL;
return TRUE;
}
LinkStack *Create_Stack()
{
LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack)/sizeof(char));
if (s == NULL)
return NULL;
s->top = NULL;
return s;
}
int StackEmpty(LinkStack *s)
{
if (s == NULL)
return FALSE;
return s->top == NULL;
}
int Push(LinkStack *s,CarData x)
{
if (s == NULL)
return FALSE;
StackNode* snode = (StackNode*)malloc(sizeof(StackNode)/sizeof(char));
if (snode == NULL)
return FALSE;
snode->data = x;
snode->next = s->top;
s->top = snode;
return TRUE;
}
int Pop(LinkStack *s,CarData *x)
{
if (s == NULL)
return FALSE;
if (StackEmpty(s))
return FALSE;
StackNode *p = s->top;
*x = p->data;
s->top = p->next;
free(p);
return TRUE;
}
int park(ParkQueue *parkq,WaitQueue *waitq,CarData x)
{
if(parkq == NULL || waitq == NULL)
return FALSE;
if(ParkQueueFull(parkq))
{
EnWaitQueue(waitq,x);
printf("车位已满,进入等候队列!\n");
}
else
{
EnParkQueue(parkq,x);
printf("成功停车,进入停车队列!\n");
}
return TRUE;
}
void display(ParkQueue *parkq,WaitQueue *waitq)
{
if(parkq == NULL || waitq == NULL)
return;
printf("停车队列-----------------------------------\n");
int tmp1 = parkq->parkfront;
do
{
tmp1 = (tmp1 + 1) % SIZE;
printf("%4d%15s%15s%9d\n",parkq->data[tmp1].id,parkq->data[tmp1].num,\
parkq->data[tmp1].name,time(NULL) % 86400 - parkq->data[tmp1].time);
}while(tmp1 != parkq->parkrear);
printf("候车队列-----------------------------------\n");
WaitNode *tmp2 = waitq->waitfront;
while(tmp2 != NULL)
{
printf("%4d%15s%15s%9d\n",tmp2->data.id,tmp2->data.num,\
tmp2->data.name,time(NULL) % 86400 - tmp2->data.time);
tmp2 = tmp2->next;
}
}
int away(ParkQueue *parkq,WaitQueue *waitq,LinkStack* s,int id)
{
CarData x;
int tmp1 = (parkq->parkfront) % SIZE;
do
{
tmp1 = (tmp1 + 1) % SIZE;
if(parkq->data[tmp1].id != id)
{
DeParkQueue(parkq,&x);
Push(s,x);
}
else
{
DeParkQueue(parkq,&x);
while(StackEmpty(s) != TRUE)
{
Pop(s,&x);
EnParkQueue(parkq,x);
}
if(WaitQueueEmpty(waitq) != TRUE)
{
DeWaitQueue(waitq,&x);
EnParkQueue(parkq,x);
}
return TRUE;
}
}while(tmp1 != parkq->parkrear);
printf("未找到该ID!\n");
return FALSE;
}
void face()
{
system("clear");
printf("**************************************************\n");
printf("| |\n");
printf("| 1、停车 2、显示 |\n");
printf("| |\n");
printf("**************************************************\n");
printf("| |\n");
printf("| 2、显示 3、离开 |\n");
printf("| |\n");
printf("**************************************************\n");
printf("| |\n");
printf("| 4、退出 |\n");
printf("| madeby:XuYuanMing |\n");
printf("**************************************************\n\n");
printf("请输入您要执行的操作(1-4):");
}
#include "park.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
int count = 7;
int main()
{
ParkQueue parkq;
InitParkQueue(&parkq);
WaitQueue* waitq = Create_Queue();
LinkStack* s = Create_Stack();
CarData data1 = {1,"qw123213","zhangsan1",time(NULL) % 86400};
CarData data2 = {2,"qw123213","zhangsan2",time(NULL) % 86400};
CarData data3 = {3,"qw123213","zhangsan3",time(NULL) % 86400};
CarData data4 = {4,"qw123213","zhangsan4",time(NULL) % 86400};
CarData data5 = {5,"qw123213","zhangsan5",time(NULL) % 86400};
CarData data6 = {6,"qw123213","zhangsan6",time(NULL) % 86400};
CarData data7 = {7,"qw123213","zhangsan7",time(NULL) % 86400};
EnParkQueue(&parkq,data1);
EnParkQueue(&parkq,data2);
EnParkQueue(&parkq,data3);
EnParkQueue(&parkq,data4);
EnParkQueue(&parkq,data5);
EnParkQueue(&parkq,data6);
EnParkQueue(&parkq,data7);
char num[20];
char name[10];
int id;
int quit;
int choice;
CarData x;
while(1)
{
face();
scanf("%d",&choice);
if(choice == 1)
{
while(1)
{
printf("请输入车牌号:");
scanf("%s",num);
printf("请输入车主名:");
scanf("%s",name);
count++;
x.id = count;
strcpy(x.num,num);
strcpy(x.name,name);
x.time = time(NULL) % 86400;
park(&parkq,waitq,x);
printf("输入1继续停车,输入2退出:");
scanf("%d",&quit);
if(quit == 2)
break;
}
}
else if(choice == 2)
{
display(&parkq,waitq);
printf("输入2退出:");
scanf("%d",&quit);
if(quit == 2)
continue;
}
else if(choice == 3)
{
while(1)
{
printf("请输入ID:");
scanf("%d",&id);
away(&parkq,waitq,s,id);
printf("输入2退出:");
scanf("%d",&quit);
if(quit == 2)
break;
}
}
else
{
break;
}
}
return 0;
}