停车场问题 数据结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s->base=(car_info *)malloc(STACK_INIT_SIZE*sizeof(car_info)); if(!s->base) exit(OVERFLOW); s->top=s->base; s->stacksize=0; } void push(sqstack *s,car_info e)//插入元素 e 为新的栈顶元素 { *s->top++=e; s->stacksize++; } car_info pop(sqstack *s)//若栈不空,则删除 s 的栈顶元素 { car_info e; if(s->top==s->base) exit(0) ; e=*--s->top; s->stacksize--; return e; } typedef struct Qnode { int car_num; int time; struct Qnode *next; }QNode,*QueuePtr;//便道的结点 typedef struct { QueuePtr front; QueuePtr rear; int lenth; }LinkQueue; //链队列 status InitQueue(LinkQueue *Q) //构造一个空队列 { Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q->front)exit(OVERFLOW); Q->front->next=NULL; Q->lenth=0; return OK; }
} printf("\n 请输入 A/D/E,车牌号,时刻:"); scanf("%c%d%d",&sign,&a.car_num,&a.time); sum--; }
四、实验结果及分析:
输入:5 10 A 10111120 0 D 10111120 1
得到如下输出结果:
五、感想与体会:
1、在做程序之前,一定要仔细分析此程序所运用的各种结构。比如在本程序中,设计 了栈队列的运用。大体轮廓如图所示:
2. 能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及 描述方法;
3. 熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空的判断条 件和描述方法;
二、实验内容:
设有一个可以停放 n 辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆 到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在 停车场最里面)。如果停车场已放满 n 辆车,则后来的车辆只能停在停车场大门外的便 道上等待,一旦停车场里有车开走,则排在便道上的第一辆车就进入停车场。若停车场 内有某辆车要开走,在它之后进入停车场的车都必须先退出停车场,为它让路,待其开 出停车场后,这些车再依原来的次序进场。每辆车离开停车场时,都应根据其在停车场 的逗留时间交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车 费,并且仍然保持在便道上等待的车辆顺序。编制一程序模拟停车场的管理。
《数据结构》
实验报告
实 验 课 程: 数据结构

业: 信息与计算科学
年级(班级): 10 级 1 班

名:

号:
山东工商学院数学与信息科学学院
实验名称
实验报告
栈和队列的应用——停车场问题
实验时间 第十周 实验地点 三教 106 指导教师
一、实验目的:
1. 熟练掌握栈和队列的结构,以及这两种数据结构的特点;
}
printf("\n**********************************************\n");
printf("|车牌号码|进站时刻|出站时刻|停留时间|停车费用|\n");
printf("|%-6d
|%-6d
|%-6d
|%-6d
|\n",a.car_num,arrivetime,a.time,a.time-arrivetime,cost);
三、实验程序:
#define OVERFLOW -2 #define OK 1 #define ERROR 0 #define STACK_INIT_SIZE 1 typedef int status ; #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<conio.h> typedef struct {
void leave(sqstack *tcc,sqstack *dcc,LinkQueue *p,car_info a,float pay,int n)//车辆离开停车场 {
car_info x,ss; QueuePtr b; int find=1,arrivetime=0; float cost=0.0; if(Check_Stack(tcc,a)){ while(find) {
{
x=pop(dcc);
push(tcc,x);
}
if(tcc->stacksize<n&&p->lenth!=0)
{
b=DeQueue(p);
x.car_num=b->car_num; x.time=a.time;
push(tcc,x);
printf("车牌号为%d 的车辆由便道进入停车场%d 号车道\n",x.car_num,tcc->stacksize);
备用栈
若停 车场 不满
停车场栈
若停车场不满 若停车场满
外来车辆
链队列
2、整体框架出来之后就是对问题的细节进行分析,比如对队列和栈的结构进行分析, 并用结构体来描述满足上述问题的节点空间。
3、然后就是利用自己所学的 c 语言的知识来进行编写程序。
4、再编完一段程序后就运行此段程序并分析程序报错原因反复进行调试,直到得到满 意的结果。
int car_num; int time; }car_info; typedef struct//车辆的信息 { car_info *base; car_info *top;
status stacksize; }sqstack; void Initstack(sqstack *s)//构造一个空栈 {
Initstack(&tcc); Initstack(&dcc); InitQueue(&p); printf("请先输入停车场的车位总数"); scanf("%d",&n); printf("请输入收费标准(元/小时):"); scanf("%f",&pay); printf("\n 请输入 A/D/E,车牌号,时刻:"); scanf("%c%d%d",&sign,&a.car_num,&a.time); while(sum) { switch(sign) { case 'a': case 'A':arrive(&tcc,&p,a,n);break; case 'D': case 'd':leave(&tcc,&dcc,&p,a,pay,n);break; case 'e': case 'E':exit(OVERFLOW);break; }
} QueuePtr DeQueue(LinkQueue *Q) {
QueuePtr p,e; if(Q->front==Q->rear) { printf("便道上没有车辆!\n"); } p=Q->front->next; e=p; Q->front->next=p->next; Q->lenth--; if(Q->rear==p)Q->front=Q->rear; return e;
} } }
void main() {
sqstack tcc,dcc; LinkQueue p;
|%-6.2f
car_info a; int sum=1000,n; float pay; char sign; printf("\n|************************停车场管理**************************|\n"); printf("|******A/a:车辆到达*******D/d:车辆离开******E/e:推出系统*****|\n\n");
push(s,a); printf("\n 车牌号为%d 的车辆进入停车场%d 号车道\n",a.car_num,s->stacksize); }
else { EnQueue(p,&a); printf("\n 停车场已满,车牌号为%d 的车辆停在便道的%d 号位置\n",a.car_num,p->lenth); } }else printf("已有此车辆"); }else printf("输入时间不对"); }
//删除队尾结点
} int Check_Stack(sqstack *s,car_info a){//检查栈里是否有相同结点
car_info *temp=s->base; while(temp!=s->top&&temp->car_num!=a.car_num) temp++; if(temp==s->top)return ERROR; else return OK;
} int Check_Queue(LinkQueue *p,car_info a){//检查队列里是否有相同结点
QNode *temp=p->front; while(temp!=p->front&&temp->car_num!=a.car_num) temp=temp->next; if(temp==p->front)return ERROR; else return OK;
ss=pop(tcc);
push(dcc,ss);
if(ss.car_num==a.car_num)//计算费用
{
find=0;
cost=(a.time-ss.time)*pay;
arrivetime=ss.time;
}
}
pop(dcc);
//把临时堆栈的要离开的车去掉;
while(dcc->stacksize)
5、对自己最后的程序进行分析,并记录自己错误的地方,加以改进。
六、得分:
指导教师评语:
□ 实验目的明确; □ 操作步骤正确; □设计文稿符合要求;
□ 实验结果正确; □ 实验分析总结全面; □实验报告规范;
Βιβλιοθήκη Baidu
评阅教师签名:
printf("**********************************************\n");
car_info *temp=tcc->base;
while(temp!=tcc->top)
{
printf("还剩以下车牌号的汽车");
printf("%d\n",temp->car_num);
temp++;
}
}
if(Check_Queue(p,a)){ if(p->front->car_num==a.car_num) DeQueue(p);
else { QueuePtr m,n; m=p->front->next; while(n->car_num!=a.car_num){ n=m; n=m->next; } m->next=n->next; free(n);
void EnQueue(LinkQueue *Q,car_info *a )//插入队尾元素 {
QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW); p->car_num=a->car_num; p->time=a->time; p->next=NULL; Q->rear->next=p; Q->rear=p; Q->lenth++;
}
void arrive(sqstack *s,LinkQueue *p,car_info a,int n)//车辆进入停车场或便道 {
if(a.time>(s->top-1)->time) { if(!Check_Stack(s,a)&&!Check_Queue(p,a)){
if(s->stacksize<n) {
相关文档
最新文档