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号车驶离便道。

数据结构(二)模拟停车场程序的实现相关推荐

  1. 数据结构实验——模拟停车场

    问题描述 设停车厂只有一个可停放5辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车 ...

  2. 模拟停车场管理系统(数据结构)

    其实这是期末作业啦...新人瑟瑟发抖.(手动滑稽 PS:工程下载:https://download.csdn.net/download/weixin_41918712/10506307 作业要求 模拟 ...

  3. c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...

    <数据结构课程设计报告停车场管理系统>由会员分享,可在线阅读,更多相关<数据结构课程设计报告停车场管理系统(8页珍藏版)>请在人人文库网上搜索. 1.数据结构课程设计报告系 别 ...

  4. Dede二次开发程序详解(dede爱好者必备)

    Dede二次开发程序详解(dede爱好者必备) 调用说明:推荐会员(带用户头像)  [quote] {dede:sql sql="SELECT mid,mtype,userid,uname, ...

  5. C语言数据结构课程设计-停车场管理

    停车场管理 1.课程设计目的 2. 课程设计内容和要求 2.1问题描述: 2.2设计要求: 3.课程设计总体方案及分析 3.1问题分析 3.2 概要设计 3.3 测试结果 4. 课程设计总结 5. 附 ...

  6. 【Java作业】模拟停车场(超详细!)

    文章目录 前言 一.实验内容 二.程序设计 1.UML图 2.设计思路 ①车类设计 ②人与车的关系 ③停车场类实现方式 ④停车场自动安排车位和扩容机制 ⑤停车场实时情况展示(display方法) ⑥获 ...

  7. Algorithm:【Algorithm算法进阶之路】之数据结构二十多种算法演示

    Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 目录 一.数据结构算法 1.顺序表 2.链表 3.栈和队列 4.串的模式匹配 5.稀疏矩阵 6.广义表 7.二叉树 8 ...

  8. Linux下多线程模拟停车场停车

    #include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> # ...

  9. 简单的模拟电话簿程序(java)

    要求:  编写一个模拟电话簿程序,实现对联系人的增删查 提示: HashMap存储联系人,Key为联系人姓名,Value为其电话号码 在console控制台中模拟增删查改 一.搭建项目结构 项目分层, ...

最新文章

  1. Linux 操作系统原理 — 内存 — mmap 进程虚拟内存映射
  2. Linux内核通知链机制的原理及实现【转】
  3. 【学习笔记】SAP 成本对象控制
  4. 甜、酸、苦、辣、咸与健康
  5. 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。...
  6. 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案
  7. 飞鸽传书 的内置的计算机处理
  8. 打造×××互连无极限,多WAN口×××防火墙
  9. 静态定义的receiver接收broadcast intent
  10. OKExChain生态项目KSwap完成50万美元种子轮融资
  11. 当前网页正在试图打开你的受信用站点列表中的站点.你想允许这样做吗?
  12. html盒子中盒子排列,解析CSS的box model盒模型及其内的子元素布局控制
  13. 一文带你详细了解光纤传感器
  14. linux下编译geos,linux下编译GDAL3.x(集成Proj和Geos等)
  15. 2013腾讯实习生面试经历
  16. 基于LMS算法的DFE判决反馈均衡器
  17. matplotlib折线图与柱状图绘制在一起
  18. html5论文期刊类参考文献,杂志论文参考文献格式
  19. TCP客户端与服务端开发
  20. 使用Date日期对象来完成,在页面上根据不同时间显示不同的问候语,如:早上好,中午好,下午好,晚上好等信息...

热门文章

  1. 美丽乡村武安市磁山二街,幸福生活的好时光
  2. 达美乐和福特想要搞事情,准备用自动驾驶汽车送外卖
  3. android闹钟app,安卓手机闹钟软件谁最好?四款安卓闹钟软件横评
  4. oracle和mysql数据类型转换_oracle数据库和MySQL数据库中表格转换时的数据类型
  5. 人工智能入门与实战-前言
  6. excel如何快速从其他表格获取产品链接
  7. 手机怎么录照片上传到抖音短视频,这个必须要知道。
  8. Android项目中集成华为账号登录、支付
  9. MAC电脑修改Linux虚拟机的固定IP地址
  10. 网页显示 :mad:_在网页上写乐谱:基础