数据结构之停车场管理系统

PS:题目网上所找


 1.前言


因为学到了数据结构,并且想写点题玩玩,正好看到了这个题,就写写看。第一次写博客,代码也会有很多问题。所以希望各位看官老爷手下留情,遇到了问题,还请评论区指正。
 

2.问题概述


1.由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。

2.而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。

3.排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来实现。

 

 

因此,本题求解过程中需用到两个栈和一个队列。栈和队列都既可以用顺序结构实现,也可以用链式结构实现。


 3.代码实现

#include <iostream>
#include <stdlib.h>
#define max_size 5

using namespace std;

class car
{
public:
    int num;
    int cartime;
};
class shortpark:public car
{
public:
    bool inputshortpark(int cartemp,int realtime);//进入便道程序
    shortpark(){shorttop=shortrear=0;shortpsum=0;spdata=new car [max_size];}
    ~shortpark(){delete []spdata;}
private:
    int shorttop;
    int shortrear;
    car * spdata;
protected:
    int shortpsum;//便道计数器----QAQ这里实在不会写了偷个懒
};
bool shortpark::inputshortpark(int cartemp,int realtime)
{
    if((shortrear+1)%max_size==shorttop)
    {
        cout<<"便道已满,请另选停车场。"<<endl;
        return true;
    }

    spdata[shortrear%max_size].num=cartemp;
    spdata[shortrear%max_size].cartime=realtime;
    shortpsum++;
    shortrear=(shortrear+1)%max_size;
    cout<<"车牌号为"<<spdata[shortrear].num<<"的车辆进入便道"<<endl;
    return true;

}
class waitspace:public car
{
public:
    waitspace(){waittop=-1;wsdata=new car[max_size];}
    ~waitspace(){delete [] wsdata;}
    bool inputwaitspace(car T);//这里写入等待区
    //bool outputwaitspace();//这里写退出等待区
    car outputwaitspacetemp();
private:
    int waittop;
    car * wsdata;
};
bool waitspace::inputwaitspace(car T)
{
    //因为逻辑,所以不测验为满
    waittop++;
    wsdata[waittop]=T;
}
/*
bool waitspace::outputwaitspace()
{
    if(waittop==-1)
    {
        return true;
    }
    outputwaitspacetemp();
}*/
car waitspace::outputwaitspacetemp()
{
    return wsdata[waittop--];
}
class park:public shortpark,public waitspace
{
public:
    park(){top=-1;data=new car[max_size];carsum=0; }
    ~park(){delete []data;}
    bool inputcar(int cartemp,int realtime); //进入停车场
    bool showcar(int realtime);//打印停车场和便道等待的车辆
    bool parkcut(int carnum,int realtime);//退出停车场
    int carsum;
private:
    car * data;
    //int rear;//尾指针
    int top;//头指针
};
bool park::inputcar(int cartemp,int realtime)
{
    if(top==max_size-1)
    {
        cout<<"停车场已满,请车辆进入便道等候"<<endl;
        inputshortpark(cartemp,realtime);//这里调用便道程序
        return true;
    }

    top++;
    data[top].num=cartemp;
    data[top].cartime=realtime;
    cout<<"车牌号为"<<data[top].num<<"的车辆进入停车场"<<endl;
    //showcar(realtime);
    return true;
}
bool park::showcar(int realtime)
{
    cout<<"停车场共有"<<top+1<<"辆车辆停放"<<endl;
    if((top+1)!=0)
    {
        for(int i=0;i<top+1;i++)
        {
            cout<<"第"<<i+1<<"辆"<<"\t"<<"车牌号是:"<<data[i].num<<"\t"<<"停放时间为:"<<realtime-data[i].cartime<<endl;
        }
    }
    cout<<endl;
    cout<<"等待区共有"<<shortpsum<<"辆车辆停放"<<endl;//QAQ实在不知道怎么实现车辆的信息打印
    return true;
}
bool park::parkcut(int carnum,int realtime)
{
    int i;
    int tempi;
    if(top==-1)
    {
        cout<<"停车场没有车辆停放,随时可以停车。"<<endl;
        return true;
    }
    for(i=0;i<top+1;i++)
    {
        if(carnum==data[i].num)
        {
            cout<<"车牌号为:"<<data[i].num<<"的车辆离开停车场"<<"\t"<<"共花费"<<(realtime-data[i].cartime)*2<<"元"<<endl;
            tempi=i;
            top--;

        }

    }
    if((top+1)-(i-1)!=0)
    {
        //剩下的进等待区
        //这里加进等待区函数
        int temptop=top;
        for(int j=i+1;j<temptop;j++)
        {
            inputwaitspace(data[j]);
            top--;
        }
        top--;
        //车辆离开,等待区的车辆进入停车场
        for(int j=top;j<temptop-1;j++)
        {
            //
            data[j]=outputwaitspacetemp();
            top++;
        }


    }
    return true;
}
int main()
{
    int x;
    int carnum;//汽车车牌号
    static int realtime=0;//初始时间

    park T;
    while(1)
    {
        cout<<"\t"<<"【停车场管理系统】"<<endl;
        cout<<"请输入菜单进入选项:"<<endl;
        cout<<endl;
        cout<<"\t"<<"1.有车辆进入停车场停放"<<endl;
        cout<<"\t"<<"2.有车辆离开停车场"<<endl;
        cout<<"\t"<<"3.模拟完成,退出程序"<<endl;
        cin>>x;

        switch(x)
        {
        case 1:
            realtime++;
            cout<<"\t"<<"请输入进入的车辆信息: "<<endl;
            cout<<"\t"<<"请输入6位纯数字车牌号:";
            cin>>carnum;
            cout<<endl;
            T.inputcar(carnum,realtime);//进入程序
            T.showcar(realtime);
            T.carsum++;


            break;

        case 2:
            //realtime++;
            realtime++;
            T.showcar(realtime);
            if(T.carsum==0)
            {
               cout<<"停车场没有车辆停放,随时可以停车。"<<endl;
               break;
            }
            cout<<endl;
            cout<<endl;
            cout<<"\t"<<"请输入离开的车辆信息: "<<endl;
            cout<<"\t"<<"请输入6位纯数字车牌号:";
            cin>>carnum;
            cout<<endl;
            T.parkcut(carnum,realtime);
            T.carsum--;

            break;

        case 3:
            exit(0);
        }
    }
    cout<<"成功退出";
    return 0;
}

 

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
      掌握基于腾讯人工智能(AI)的车牌识别技术,使用车牌识别技术实现一个完整的停车场管理系统,项目包括网页调用摄像头拍照,车牌拍照识别,上传车牌图片识别,用户管理,车辆管理(临时车与包月车),车辆出场,入场管理,停车费收费管理,按照临时车或包月车自动计算停车费,系统参数设置,修改用户密码及安全退出等功能,该系统采用Jsp技术,使用SSM框架,Mysql数据库,ajax技术及人工智能等相关技术实现。重要通知:本课程根据腾讯AI车牌识别新接口,更新了新接口源代码,发布程序,购买了课程的同学可以下载新程序,包括(运行程序及源代码),更新时间:2021-2-17项目开发技术:java,jsp,mysql,MyBatis,SpringMVC,jquery,ajax,json项目运行环境:jdk1.7及以上版本,tomcat6.0及以上版本,mysql5.5及以上版本项目开发工具: 本项目开发工具是Eclipse,也支持myEclipse,Intellij Idea等其他版本开发工具相关课程学习顺序本校课程是培养JAVA软件工程师及JSP WEB网络应用程序开发,android工程师的全套课程,课程学习顺序如下:JAVA初级工程师:    1、计算机基础    2、HTML语言基础    3、C语言从入门到精通+贪吃蛇游戏    4、贪吃蛇游戏    5、SQL SERVER数据库基础    6、JAVA从入门到精通+推箱子游戏+QQ即时通讯软件    7、推箱子游戏;    8、仿QQ即时通讯软件;JAVA中级工程师:    9、SQLSERVER数据库高级    10、SQLSERVER从入门到精通(基础+高级)              11、JavaScript从入门到精通,    12、JSP从入门到精通+点餐系统,    13、JSP从入门到精通+在线视频学习教育平台,    14、JSP从入门到精通+大型电商平台;    15、XML从入门到精通,    16、数据结构(JAVA版),JAVA高级工程师:    17、Oracle数据库从入门到精通,    18、ajax+jquery从入门到精通,    19、EasyUI从入门到精通,SSH框架:    20、Struts2从入门到精通课程,    21、Hibernate从入门到精通课程,    22、Spring从入门到精通课程;    23、Echarts从入门到精通,    24、Excel基于POI的导入导出工作流框架:    25、Activiti流程框架从入门到精通    26、JBPM流程框架从入门到精通SSM框架:    27、MyBatis从入门到精通    28、Spring MVC从入门到精通面试题:    29、职业生涯规划及面试题集锦商业项目:    30、微信公众号在线支付系统    31、微信生活缴费在线支付系统    32、支付宝生活缴费在线支付系统    33、在线考试系统    34、手机订餐管理系统,    35、CRM客户关系管理系统    36、大型房地产CRM销售管理系统    37、CMPP2,CMPP3移动网关系统人工智能:    38、人脸识别在线考试系统    39、人脸识别系统项目实战    40、车牌识别系统项目实战    41、身份证识别系统项目实战    42、营业执照识别系统项目实战          43、名片识别管理系统
实验二 停车场管理 班级:A0712 学号:12 姓名:冷清淼 成绩:__________ 指导教师签名:__________ 一、问题描述 设停车场一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场 ,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若停车场已停满 n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开 入。当停车场某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该 辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时 间的长短交费(在便道上停留的时间不收费)。 设计要求: 1.模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。 2.从终端读入汽车到达或离去的数据,每组数据包括三项: (1)是"到达"还是"离开"; (2)汽车牌照; (3)"到达"或"离开"的时刻。 3.与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或 便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。 二、算法说明 1.数据结构说明 (1)用到两个堆栈:一个为车场栈;另一个为临时栈temp typedef struct NODE{ CarNode *stack[MAX+1]; int top; }SeqStackCar; /*模拟车场*/ 一个队列结构,存储便道车辆信息: typedef struct Node{ QueueNode *head; QueueNode *rear; }LinkQueueCar; /*模拟便道*/ 2.算法说明 (1) 功能模块说明:停车场管理系统含有三个模块,即:车辆到达、离开、列表显示 图1 (2)以模块为单位分析算法 1、"到达"模块:到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到 便道等待。如图2。 图2 2."离开"模块:离开时,当车库为空时,提示没有车,结束;否则车辆离开。如图3。 图3 3. "显示"模块:显示模块有两个显示选项,即:车场与便道。如图4。 图4 三、测试结果 (一)测试用例(说明:测试用例要合理并且足够,既要有正确用例,也要有错误用例 ,同时检验程序的正确性和强壮性) 1.第一组测试用例 (1)测试输入:停车场的车辆离开,如下表: "服务选择 "车牌号/车位 "到达/离开时间 " "1 "QH058 "15:25 " "1 "AB123 "18:45 " "1 "EA642 "23:15 " "2 "2 "0:30 " "2 "1 "0:65(错误) " (2)测试目的:测试离开方法时间格式控制以及费用计算是否正确。 (3)正确输出:第一次离开的是AB123,应交费3.45元。第二次时,当在输入65时, 应该提示输入错误,重输。 (4)实际输出: (5)错误原因:第一个错误是在计算时,一个数字错了;第二个是没有对时间格式 控制。 (6)当前状态:已改正 2.第二组测试用例 (1)测试输入:连续6辆车到达,如下表: " 服务选 " 车牌号 " 到达时间 " "择 " " " "1 "A8828 "7:56 " "1 "S2296 "8:25 " "1 "WW666 "8:45 " "1 "HK456 "15:50 " "1 "GH999 "12:30 " "1 "DD555 "13:40 " 测试目的:测试到达方法与列表显示方法能否正确完成。 (3)正确输出:先到达的五辆车先进入停车场,最后到达的一辆在便道等候。 (4)实际输出: (5)错误原因:没有作出时间先后的判断,而是先输入先进入。 (6)当前状态:待修改 3.第三组测试用例 (1)测试输入:接上一步输入离开信息,下表: "服务选择"离开车位"离开时间"便道车进入时 " " " " "间 " "2 "3 "13:30 "13:40 " (2)测试目的:测试离开方法功能是否成功以及便道进入车场是否正确。 (3)正确输出:输出3号车位的车辆离开信息清单,便道1号车进入停车场。 (4)实际输出: 错误原因:没有错误。 (6)当前状态:通过 (二)测试结果分析 此停车管理系统基本可能实现一个小的停车场的管理,其"到达"与"离开"方法都相对比 较完整,以及结算清单明了。尽管在时间先后上有出现混乱,但当其用到实际应用时, 那个时间先后就可以避免了。但在输入数据时,要按照严格的格式输入,否则有可能出 现死去或崩溃。若本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关 机等,而此系统的缺点却是没有保存功能,关闭之后就要重新建立了。会慢慢完善。 附录:源代码 ///系统说明:本系统适应于小型停车场,且停车时间在一天之的短期停放停车场。 //在此系统中,车库容量设置为5,便于测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值