设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排以便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场时,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理
问题理解:
在调度过程中,道路是一个队列停车场是一个栈,同时要建立一个临时停车场park2.
代码如下:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<memory.h>
typedef struct CarNode
{
int data;
time_t in_time;
time_t out_time;
struct CarNode *next;
}CarNode,*ptrCarNode;
typedef struct CarParking
{
int n;
int size;
struct CarNode *top;
//struct CarNode *bottom;
}CarParking,*ptrCarParking;
//路旁的队列
typedef struct CarRoad
{
struct CarNode *front;
struct CarNode *back;
}CarRoad,*ptrCarRoad;
//初始化队列
void init_Road(ptrCarRoad carp)
{
carp->front=carp->back=NULL;
}
int empty_Road(ptrCarRoad carp)
{
if(carp->front==NULL)
return 1;
else
return 0;
}
//插入队列
void insert_Road(ptrCarRoad carp,ptrCarNode newCar)
{
newCar->next=carp->back;
if(empty_Road(carp))
{
carp->front=newCar;
}
carp->back=newCar;
}
//出队操作
ptrCarNode pop_Road(ptrCarRoad carp)
{
ptrCarNode ret =carp->front;
if(carp->front->next==NULL)
carp->back=NULL;
carp->front=carp->front->next;
return ret;
}
//初始化
void init_parking(ptrCarParking carp)
{
carp->n=0;
carp->top=NULL;
}
//进入栈
void insert_parking(ptrCarParking carp,ptrCarNode newCar)
{
// newCar->data=in;
newCar->next=carp->top;
carp->top=newCar;
carp->n++;
}
//判空
int empty_parking(ptrCarParking carp)
{
if(carp->n==0)
return 1;
else
return 0;
}
//判满
int full_parking(ptrCarParking carp)
{
if(carp->n==carp->size)
return 1;
else
return 0;
}
//出站
ptrCarNode pop_parking(ptrCarParking carp)
{
// newCar->data=in;
ptrCarNode ret;
carp->n--;
ret=carp->top;
carp->top=carp->top->next;
return ret;
}
//进入请求
void ReqestIn(ptrCarParking parking,ptrCarRoad road,ptrCarNode node)
{
//道路为空
if(!empty_Road(road))
{
printf("\troad is not empty\n");
insert_Road(road,node);
}
//停车场已满
else if(full_parking(parking))
{
printf("\tPark is not empty Car %d park in road\n",node->data);
insert_Road(road,node);
}
else
{
time(&node->in_time);
printf("\tCar %d is in parking\n",node->data);
insert_parking(parking,node);
}
}
//出停车场
ptrCarNode ReqestOut(ptrCarParking parking,ptrCarRoad road,int n)
{
//返回节点 ret,
ptrCarNode ret,top2;
ptrCarParking park2;
ret=NULL;
park2=(ptrCarParking)malloc(sizeof(CarParking));
init_parking(park2);
while(!empty_parking(parking))
{
top2=pop_parking(parking);
if(top2->data==n)
{
//找到n
printf("\tfind %d at position :%d\n",n,parking->n+1);
ret=top2;
time(&ret->out_time);
break;
}
insert_parking(park2,top2);
}
//所有车重新进入车场
while(!empty_parking(park2))
{
insert_parking(parking,pop_parking(park2));
}
free(park2);
//将道路上的车进入车场
while(!full_parking(parking)&&!empty_Road(road))
{
top2=pop_Road(road);
time(&top2->in_time);
insert_parking(parking,top2);
}
return ret;
}
//显示menu
void menu()
{
printf("\t********************************************************\n");
printf("\t* *\n");
printf("\t* 1 I want to parking *\n");
printf("\t* *\n");
printf("\t* 2 I want to leave *\n");
printf("\t* *\n");
printf("\t* 3 I want to quit *\n");
printf("\t* *\n");
printf("\t********************************************************\n");
}
int main()
{
ptrCarParking aaa;
ptrCarNode in;
ptrCarNode in2;
ptrCarRoad road;
time_t rawtimet;
struct tm* timeinfo;
road=(ptrCarRoad)malloc(sizeof(CarRoad));
init_Road(road);
aaa=(ptrCarParking)malloc(sizeof(CarParking));
init_parking(aaa);
menu();
printf("\tinput the capability of the parking : ");
scanf("%d",&aaa->size);
//system("cls");
while(1)
{
char choice;
system("cls");
menu();
printf("\t choose what you want to do:");
fflush(stdin);
choice=getchar();
if(choice == '1')
{
system("cls");
menu();
in=(ptrCarNode)malloc(sizeof(CarNode));
printf("\t input the your car number : ");
scanf("%d",&in->data);
ReqestIn(aaa,road,in);
}
else if(choice=='2')
{
int n;
system("cls");
menu();
printf("\tinput the your car number : ");
scanf("%d",&n);
in=ReqestOut(aaa,road,n);
if(in!=NULL)
{
rawtimet=in->out_time-in->in_time;
timeinfo = localtime ( &rawtimet );
printf("\tCar %d parking time:%d:%d",in->data,timeinfo->tm_min,timeinfo->tm_sec);
}
}
else if(choice=='3')
{
exit(0);
}
fflush(stdin);
getchar();
}
return 0;
}
代码下载地址:
http://download.youkuaiyun.com/detail/jiutoushe2008/6442125