数据结构(二)模拟停车场程序的实现
1.实验目的:掌握线性表的基本操作,深入理解栈、队列的存储结构并掌握进栈、出栈和入队、出队的实现。
2.解题思路:
问题:设有一个可停放N辆汽车的狭长停车场,只有一个大门供车辆出入,车辆按到达先后顺序从最里面向大门口停放。如果已放满N辆车,再来的车辆只能在大门外的便道上等候,一旦有车辆从停车场离开排在便道上的车辆可依次进入停车场。停车场中某车辆离开时,在它之后进入停车场的车辆必须为它让路退出停车场,等待该车辆离开后,其后车辆依原次序进入停车场。每辆汽车在离开时,都要依据停留时间缴费;停在便道上的车辆不收费,在便道上某车辆进入停车场或离去后,其余车辆依然保持原来的次序。
思路:汽车的模拟输入信息格式可定义为:
(到达/离去的标志,汽车牌照号码,到达/离开的时刻)
例如(‘A’,1,5)表示:1号牌照汽车在5时刻到达;而(‘D’,5,20)表示:5号牌照汽车在时刻20离去。整个程序在输入(‘E’,0,0)时结束。
3.程序实现:
/*停车场管理*/
#include "stdio.h"
#include<stdlib.h>
#define N 3
#define M 5
#define Null 0
#define True 1
#define False 0
/*定义车辆的数据类型*/
typedef struct
{int num; /*车辆车牌号*/int arrtime; /*车辆到达时间*/
}elemtype;
/*定义顺序栈(停车场)数据类型*/
typedef struct //
{elemtype stack[N];/*定义存放元素的数组*/int top;/*定义栈顶指针*/
}sqstktp;/*定义链队列元素(停在停车场外便道上的车辆)数据类型*/
typedef struct node
{int num;/*车牌号*/struct node *next;/*后边相邻车辆所在位置*/
}queueptr;
/*链队列的队头指针和队尾指针的数据类型*/
typedef struct
{queueptr *front,*rear;/*链队列的队头指针和队尾指针*/
}linkedquetp;/*初始化顺序栈(停车场)*/
void inistack(sqstktp *s)
{s->top=-1;/*栈顶指针置为-1*/
}/*元素入栈(汽车驶入停车场)*/
int push(sqstktp *s,elemtype x)
{if(s->top==N-1)/*如果栈满(停车场无车位)*/return (False);/*返回0*/else{s->stack[++s->top]=x;
/*首先栈顶指针+1,然后元素入栈(车辆驶入停车场)*/return(True);/*返回1*/}
}
/*元素出栈(汽车驶出停车场)*/
elemtype pop(sqstktp *s)
{elemtype x;/*出栈元素(要驶出停车场的车辆)*/if(s->top<0)/*如果是空栈(停车场无车)*/{x.num=Null;/*车牌号置为0*/x.arrtime=Null;/*车辆到达时间置为0*/return(x);/*返回0,0*/}else{s->top--;/*当前栈顶元素-1*/return(s->stack[s->top+1]);/*返回原栈顶元素*/}
}
/*创建一个空链队列*/
void inilinkedque(linkedquetp *s)
{s->front=(queueptr *)malloc(sizeof(queueptr));/*动态得到链队列的队头和队尾指针空间*/s->rear=s->front;/*初始化双指针重合*/s->front->next=Null;/*无后继*/s->front->num=0;
/*该域用于记录便道上等待进入停车场的车辆数,初值为0*/
}/*链队列元素入队(新到车辆在便道上等候)*/
void enlinkedque(linkedquetp *s,int num1)
{queueptr *p;p=(queueptr *)malloc(sizeof(queueptr));
/*动态得到一个临时便道上的一个停车位*/p->num=num1;/*记录车牌*/p->next=Null;/*标记为无后继*/s->rear->next=p;/*新到车辆插入队尾(成为当前队尾的后继)*/s->rear=p;/*修改队尾指针*/s->front->num++;/*便道上等待进入停车场车辆数+1*/
}
/*链队列元素出队(便道上车辆驶离便道进入停车场)*/
int dllinkedque(linkedquetp *s)
{queueptr *p;/*定义临时队列元素变量p*/int n;/*定义记录离队元素车牌信息的临时变量n*/if(s->front==s->rear)/*便道上无车辆等候进入停车场*/return(Null);/*返回0*/else{p=s->front->next;/*保存队头元素所在的位置到p*/s->front->next=p->next;/*p的相邻后继元素成为新的队头元素*/if(p->next==Null)/*如果p无相邻后继*/s->rear=s->front;/*链队列为空队列*/n=p->num;/*取离队元素的车牌信息到n*/free(p);/*释放空间*/s->front->num--;/*队列元素数量-1*/return(n);/*返回离队车辆的车牌*/}
}/*车辆到达*/
void arrive(sqstktp *s1,linkedquetp *p,elemtype x)
{int f;/*定义临时变量f,标识:1=入栈成功,0=入栈失败*/f=push(s1,x);/*调度进栈子程序*/if(f==False)/*如果0=入栈失败*/{enlinkedque(p,x.num);/**/printf("第%d号车停在便道第%d号车位上\n",x.num,p->front->num);
/*显示车牌信息和位置信息*/}elseprintf("第%d号车停在存车场第%d号车位上\n",x.num,s1->top+1);
/*显示车牌信息和停车场内位置*/
}/*车辆离开*/
void delive(sqstktp *s1,sqstktp *s2,linkedquetp *p,elemtype x)
{int n,f=False;
/*定义暂存便道上车辆数量n和标识临时变量f,f=1为真,f=0为假*/elemtype y;/*定义存放车牌信息的临时变量y*/queueptr *q;/*链队列元素临时变量*/while((s1->top>-1)&&(f!=True))/*如果停车场不为空且f=0*/{y=pop(s1);/*调度出栈子程序,y=车牌(栈顶位置车辆出栈s1)*/if(y.num!=x.num)/*如果不是要离开的车辆*/n=push(s2,y);/*将其压入附栈s2*/elsef=True;/*置f=1,循环结束*/}
if(y.num==x.num)/*是要离开的车辆*/{printf("第%d号车应收费%d元\n",y.num,(x.arrtime-y.arrtime)*M);
/*显示车牌和缴费信息*/while(s2->top>-1)/*如果附栈s2不为空*/{y=pop(s2);/*s2栈顶元素出栈,y=车牌*/f=push(s1,y);}n=dllinkedque(p);/*取队头元素*/if(n!=Null)/*如果便道有车,则驶入停车场*/{y.num=n;y.arrtime=x.arrtime;/*计费时间为刚才离去车辆的离开时间*/f=push(s1,y);/*车辆驶入停车场*/printf("第%d号车停在存车场的第%d号车位上\n",y.num,s1->top+1);
/*显示刚刚进入车辆在停车场位置*/}}else{while(s2->top>-1)/*停车场未找到要离去的车辆*/{y=pop(s2);/*便道里的车放入停车场*/f=push(s1,y);}q=p->front;f=False;while(f==False&&q->next!=Null)/*在便道寻找要离去的车辆*/if(q->next->num!=x.num)q=q->next;else{q->next=q->next->next;/*在便道找到要离去的车辆*/p->front->num--;/*便道车辆数目-1*/if(q->next==Null)p->rear=p->front;/*便道没有车的情况*/printf("第%d号车离开便道\n",x.num);f=True;}if(f==False)printf("输入数据错误,停车场和便道均无第%d号车\n",x.num);}}int main()
{char ch1,ch2;/*定义两个字符型变量*/sqstktp *s1,*s2;/*定义两个顺序栈指针变量*/linkedquetp *p;/*定义一个链队列指针变量*/elemtype x;/*定义车牌变量*/int flag;/*标识变量*/s1=(sqstktp *)malloc(sizeof(sqstktp));/*得到s1顺序栈*/s2=(sqstktp *)malloc(sizeof(sqstktp));/*得到s2顺序栈*/p=(linkedquetp *)malloc(sizeof(linkedquetp));/*得到一个链队列p*/inistack(s1);/*初始化s1栈*/inistack(s2);/*初始化s2栈*/inilinkedque(p);/*初始化链队列p*/flag=True;/*标识变量置1*/for(;;){printf("输入数据:'A'/'D',车牌号,到达/离开时间\n");scanf("%c %d %d",&ch1,&x.num,&x.arrtime);ch2=getchar();switch(ch1){case 'A':arrive(s1,p,x);break;case 'D':delive(s1,s2,p,x);break;case 'E':flag=False;printf("程序正常结束\n");break;default:printf("输入数据错误,重新输入\n");}if(flag==False)break;}return 0;
}
四. 测试数据:
分别依次向停车场停入5辆车,发现车牌号为1,2,3的车依次进去停车场的1,2,3号车位上,车牌号为4,5的车辆依次停在1,2号便道上。将2号车驶离停车场,到达时间为2,离开时间设为6,则收费为(6-2)*5=20元,将5号车驶离便道。
数据结构(二)模拟停车场程序的实现相关推荐
- 数据结构实验——模拟停车场
问题描述 设停车厂只有一个可停放5辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车 ...
- 模拟停车场管理系统(数据结构)
其实这是期末作业啦...新人瑟瑟发抖.(手动滑稽 PS:工程下载:https://download.csdn.net/download/weixin_41918712/10506307 作业要求 模拟 ...
- c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...
<数据结构课程设计报告停车场管理系统>由会员分享,可在线阅读,更多相关<数据结构课程设计报告停车场管理系统(8页珍藏版)>请在人人文库网上搜索. 1.数据结构课程设计报告系 别 ...
- Dede二次开发程序详解(dede爱好者必备)
Dede二次开发程序详解(dede爱好者必备) 调用说明:推荐会员(带用户头像) [quote] {dede:sql sql="SELECT mid,mtype,userid,uname, ...
- C语言数据结构课程设计-停车场管理
停车场管理 1.课程设计目的 2. 课程设计内容和要求 2.1问题描述: 2.2设计要求: 3.课程设计总体方案及分析 3.1问题分析 3.2 概要设计 3.3 测试结果 4. 课程设计总结 5. 附 ...
- 【Java作业】模拟停车场(超详细!)
文章目录 前言 一.实验内容 二.程序设计 1.UML图 2.设计思路 ①车类设计 ②人与车的关系 ③停车场类实现方式 ④停车场自动安排车位和扩容机制 ⑤停车场实时情况展示(display方法) ⑥获 ...
- Algorithm:【Algorithm算法进阶之路】之数据结构二十多种算法演示
Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 目录 一.数据结构算法 1.顺序表 2.链表 3.栈和队列 4.串的模式匹配 5.稀疏矩阵 6.广义表 7.二叉树 8 ...
- Linux下多线程模拟停车场停车
#include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> # ...
- 简单的模拟电话簿程序(java)
要求: 编写一个模拟电话簿程序,实现对联系人的增删查 提示: HashMap存储联系人,Key为联系人姓名,Value为其电话号码 在console控制台中模拟增删查改 一.搭建项目结构 项目分层, ...
最新文章
- Linux 操作系统原理 — 内存 — mmap 进程虚拟内存映射
- Linux内核通知链机制的原理及实现【转】
- 【学习笔记】SAP 成本对象控制
- 甜、酸、苦、辣、咸与健康
- 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。...
- 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案
- 飞鸽传书 的内置的计算机处理
- 打造×××互连无极限,多WAN口×××防火墙
- 静态定义的receiver接收broadcast intent
- OKExChain生态项目KSwap完成50万美元种子轮融资
- 当前网页正在试图打开你的受信用站点列表中的站点.你想允许这样做吗?
- html盒子中盒子排列,解析CSS的box model盒模型及其内的子元素布局控制
- 一文带你详细了解光纤传感器
- linux下编译geos,linux下编译GDAL3.x(集成Proj和Geos等)
- 2013腾讯实习生面试经历
- 基于LMS算法的DFE判决反馈均衡器
- matplotlib折线图与柱状图绘制在一起
- html5论文期刊类参考文献,杂志论文参考文献格式
- TCP客户端与服务端开发
- 使用Date日期对象来完成,在页面上根据不同时间显示不同的问候语,如:早上好,中午好,下午好,晚上好等信息...