问题描述:
设有一个可以停放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.csdn.net/detail/jiutoushe2008/6442125