停车场管理系统报告

更新时间:2023-07-24 12:53:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验二 栈和队列及其应用

一、 实验题目:

栈和队列及其应用——停车场管理

二、 实验内容:

设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北段),若停车厂内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车迹可开入;停车场内某辆车要离开时,在它之后进入的车连必须先退出车厂为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车时必须按它停留的时间长短缴纳费用。编写按上述要求进行管理的模拟程序。

可以将停车场定义成一个顺序栈s0,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,所以必须有一个临时的顺序栈s1,存放让道的车辆。

当有车辆进停车场时,若栈s0不满,则直接进入栈s0;若栈s0满,则进入便道(链队列q)。若有s0中车辆x离开时,先让在x后面进栈的车从s0退栈并进入栈s1中,让x离开并收取停车费(在便道上停留的时间不收费),然后再把s1中所有元素退栈并重新进入s0栈,最后,将链队列q中的队头元素出队并进栈到s0中。

三、 程序源代码:

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

#include<string.h>

#define car_stop_max 2

struct Time//定义时间类型结构体

{

int year;

int month;

int day;

int hour;

int miniute;

int second;

};

struct cars//定义汽车类型结构体 包括车牌号 时间

{

char *car_id;

Time car_time;

};

struct sqStack//建立汽车栈的指针

{

cars *base;

cars *top;

};

int InitStack(sqStack &s)//初始化汽车

{

s.base=(cars*)malloc((car_stop_max)*sizeof(cars));

if(!s.base)

{

return 1;

}

s.top=s.base;

return 0;

}

cars Get_Stack_top(sqStack s)//得到汽车栈顶元素

{

if(s.top==s.base)

{

printf("没有车");

exit(1);

}

else

return *(s.top-1);

}

void Push_car(sqStack &s ,cars e)//汽车栈插入新的汽车

{

if(s.top-s.base>=car_stop_max)

{

printf("停车满\n");

}

else

{

s.top->car_id=new char [15];

strcpy(s.top->car_id,e.car_id);

s.top->car_time=e.car_time;

s.top++;

}

}

void Pop_car(sqStack &s)//汽车栈的汽车离开

{

if(s.base==s.top)

printf("没有车");

else

s.top--;

}

typedef struct QNode//汽车队列结构体

{

cars date;

struct QNode *next;

}QNode,*QueuePtr;

struct LinkQueue//汽车队列指针

{

QueuePtr front;

QueuePtr rear;

};

int InitQueue(LinkQueue &Q)//汽车队列的初始化

{

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q.front)

{

printf("不能初始化队列");

exit(1);

}

Q.front->next=NULL;

return 0;

}

void EnQueue(LinkQueue &Q,QNode e)//汽车队列添加新元素

{

QueuePtr p=(QueuePtr)malloc(sizeof(QNode));

p->date.car_id=new char [15];

strcpy(p->date.car_id,e.date.car_id);

p->date.car_time=e.date.car_time;

Q.rear->next=p;

Q.rear=p;

}

int DeQueue(LinkQueue &Q)//删除汽车队头元素

{

if(Q.front==Q.rear)

{

printf("空车,不能删除");

exit(1);

}

QueuePtr p;

p=Q.front->next;

if(Q.front->next==Q.rear)

{

Q.rear=Q.front;

}

Q.front->next=p->next;

free(p);

return 0;

}

cars Get_Queue_top(LinkQueue &Q)//得到汽车队头元素

{

if(Q.front==Q.rear)

{

printf("空车");

exit(1);

}

else

return (Q.front->next->date);

}

void Get_time(int &year,int &month,int &day,int &hour ,int &miniute,int &second)//产生时间函数

{

time_t t = time(0);

char tmp[64];

strftime( tmp, sizeof(tmp), "%Y %m %d %X %A %j %z",localtime(&t) );

sscanf(tmp,"%d%d%d%d:%d:%d",&year,&month,&day,&hour,&miniute,&second);

}

void main()

{

int i,j=0;

int sum=0;

double money=5;

int Choose ;

char c;

char b[10];

cars e,e2;

cars *p;

e.car_id=new char[15];

QNode E,E2;

LinkQueue Q;

sqStack s1,s2;

InitQueue(Q);

InitStack(s1);

InitStack(s2);

printf(" 欢迎进入停车场管理系统\n");

printf(" 按1进入车辆 \n");

printf(" 按2离开车辆 \n");

printf(" 按0退出系统 \n");

printf("*************************************************\n");

printf("请输入您的选择 ");

scanf("%d",&Choose);

while(Choose!=0)

{

switch(Choose)

{

case 1:

printf("请输入你的车牌号 ");

i=0;

while((c=getchar())!=' ')

{

b[i++]=c;

}

b[i]='\0';

strcpy(e.car_id,b);

Get_time(e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second);

if(sum>=car_stop_max)

{

E.next=NULL;

E.date=e;

printf("停车场已停满。请您在便道等候。\n");

EnQueue(Q,E);

}

else

{

printf("您在%d 年%d月%d日 %d:%d:%d 时刻进入\n",e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second); //测试结果

Push_car(s1,e);

sum++;

}

printf("***************************************************\n");

printf("输入你的选择 ");

scanf("%d",&Choose);

break;

case 2:

printf("请输入出停车场的车牌号 ");

i=0;

while((c=getchar())!=' ')

{

b[i++]=c;

}

b[i]='\0';

strcpy(e.car_id,b);

Get_time(e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second);

p=s1.top;

j=0;

while(j<sum&&(strcmp((p-1)->car_id,e.car_id))!=0)

{

j++;

p--;

}

if(j<sum)

{

i=0;

money=((e.car_time.second-(p-1)->car_time.second)+(e.car_time.miniute-(p-1)->car_time.miniute)*60);

printf("车牌号为%s的车离开,缴纳费用%f元\n",b,money);

while(i<j)

{

e2=Get_Stack_top(s1);

Pop_car(s1);

Push_car(s2,e2);i++;

}

Pop_car(s1);

i=0;

while(i<j)

{

e2=Get_Stack_top(s2);

Pop_car(s2);

Push_car(s1,e2);i++;

}

sum--;//汽车总是要减少了

if(sum<car_stop_max&&(Q.front!=Q.rear) )

{

E2.date=Get_Queue_top(Q);

strcpy(e.car_id,E2.date.car_id);

Get_time(e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second);

DeQueue(Q);

Push_car(s1,e);

printf("您%s在%d 年%d月%d日 %d:%d:%d 时刻进入\n",e.car_id,e.car_time.year,e.car_time.month,e.car_time.day,e.car_time.hour,e.car_time.miniute,e.car_time.second); //测试结果

sum++;

}

}

else

printf("此辆车不存在\n");

printf("***************************************************\n");

printf("输入你的选择 ");

scanf("%d",&Choose);

break;

case 0:

printf("您要离开此系统 ");break;

default:

{

printf("***************************************************\n");

printf("输入错误重新输入 ");

}

scanf("%d",&Choose);break;

}

}

}

四、 测试结果:

五、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)

注:内容一律使用宋体五号字,单倍行间距

1)定义汽车类型的结构体,包括汽车车牌号为char*类型,进入停车场的时间 类型又是时间类型的结构体。用函数void Get_time(int &year,int &month,int &day,int &hour ,int &miniute,int &second)//产生时间函数,返回需要的时间。

2)初始化栈时, s.top=s.base;将两者的顺序写反了,造成建立的的失败;

3)定义结构体时,两个结构体类型的变量可以直接赋值,如果结构体中不包含数组类型的变量,如果结构体中有指针也可以直接赋值。但是如果其中一个指针发生改变,则另一个也要改变

4)用全局变量sum控制停车场中车的数量。如果车进入sum++,如果车要离开时则sum--;

5)删除队列中的元素时

if(Q.front->next==Q.rear)

{

Q.rear=Q.front;

}

Q.front->next=p->next;两句话不能颠倒

6)如果有汽车要离开时,要判断便道是否有车,如果有,则要进入停车场,并记录进入时间;

7)汽车进入停车场时,

void Push_car(sqStack &s ,cars e)//汽车栈插入新的汽车

{

if(s.top-s.base>=car_stop_max)

{

printf("停车满\n");

}

else

{

s.top->car_id=new char [15];

strcpy(s.top->car_id,e.car_id);

s.top->car_time=e.car_time;

s.top++;

}

}

要给汽车的车牌号记录,开辟空间来放字符串。

本文来源:https://www.bwwdw.com/article/7enm.html

Top