数据结构课设——停车场管理

题目

设停车场(如下图1所示)内只有一个可停放几量汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已经停满几量汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆汽车即可开入;当停车场内某车辆要离开时,由于停车场是狭长的通道,在它之后开入车场的车辆必须先退出车场为它让路,待该车辆开出大门外后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。试设计一个停车场管理程序(这里只是一个假想的停车场管理,并不代表实际的停车场管理)。

分析:汽车在停车场内进出是按照栈的运算方式来实现的,先到的先进停车场;停车场的汽 车离开停车场时,汽车场内其它汽车为该辆汽车让路,也是按栈的方式进行;汽车在便道上等候是按队列的方式进行的。因此,将停车场设计成一个栈,汽车让路也需要另一个栈来协助完成,汽车进出便道用队列来实现。

本设计,栈采用顺序栈结构,队列用链式存储结构。
存储结构定义如下:

 #define  stacksize  10
 typedef  struct  sqstack
 {
  int  data[stacksize];
  int  top;
 } SqStackTp;
typedef struct  linked_queue
{
  int  data;
  struct  linked_queue  * next;
}LqueueTp;
typedef  struct 
{
  LqueueTp  *front ,  *rear ;
} QueptrTp;

停车场管理的算法描述如下:
1)接受命令和车号,若是汽车要进停车场,先判断停车场栈是否满,若不满,则汽车入栈,否则汽车进入便道队列等候。
2)若是汽车要离开停车场,为给汽车让路,将停车场栈上若干辆汽车入临时栈,等这辆车出停车场后,临时栈中的汽车出栈,在回到停车场栈,然后看便道队列是否为空,若不空则说明有汽车等候,从队头取出汽车号,让该车进入停车场栈。
3)重复1),2)直到为退出命令(车号为0或负数)。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
typedef struct Queue
{
    int data;
    struct Queue *next;
} Queue,*Que;
int vis[N],top=0; //用栈表示停车场
Que Q; //表示等待序列
int length; //表示停车场容量
int cnt = 0; //表示当前停车场内有多少车辆
int rem = 0; //表示等待区车辆的数量

void enter(int num,Que &Q); //表示停车
void enterqueue(Que &Q,int num); //入队操作
void leave(int num,Que &Q); //表示离开
void leavevis(int num); //表示离开停车场的操作
int popqueue(Que &Q); //表示出队操作
int main()
{
    Q=new Queue; //初始化等待区
    char op;
    int num;
    cout<<"请输入停车场的容量 : ";
    cin>>length;
    cout<<endl;
    while(1)
    {
        cout<<"T-停车,L-离开,其他字符-操作结束"<<endl;
        cout<<"请输入操作和车辆编号 : ";
        cin>>op>>num; //输入操作和车辆编号
        if(op=='T') //停车
            enter(num,Q);
        else if(op=='L') //表示离开
            leave(num,Q);
        else //其他字符表示输入结束
            break;
    }
    cout<<"操作结束"<<endl;
    return 0;
}
int popqueue(Que &Q) //表示出队操作
{
    int k=Q->next->data;
    Que p=Q->next;
    Q->next=p->next;
    free(p);
    rem--;
    return k;
}
void leavevis(int num) //表示离开停车场的操作
{
    int i;
    for(i=1; i<=top; i++) //判断该车辆是否在停车场中
    {
        if(vis[i]==num) break;
    }
    for(int j=i; j<=top; j++) swap(vis[j],vis[j+1]);
    top--;
    cnt--;
    //for(int i=1;i<=top;i++) cout<<vis[i]<<endl;
}
void leave(int num,Que &Q) //表示离开
{
    int f=0;
    for(int i=1; i<=top; i++) //判断该车辆是否在停车场中
    {
        if(vis[i]==num)
            f=1;
    }
    if(f==1) //表示从停车场中离开
    {
        leavevis(num);
        cout<<num<<"号车辆已经从停车场中离开!"<<endl<<endl;
        if(Q->next==NULL) //判断有没有车辆在等待区
            cout<<"当前等待区为空,没有车辆进入停车场"<<endl<<endl;
        else //有车辆在等待区
        {
            int k=popqueue(Q);
            vis[++top] = k;
            cnt++;
            cout<<k<<"号车辆已经进入停车场,当前还有"<<rem<<"辆车在等待区"<<endl<<endl;
        }
    }
    else if(f==0) //表示从等待区中离开
    {
        Que p1=Q,p2=Q->next;
        while(p2->data!=num&&p2->next!=NULL)
        {
            p2=p2->next;
            p1=p1->next;
        }
        if(p2->data!=num) cout<<"当前车辆不存在!"<<endl<<endl;
        else
        {
            p1->next=p2->next;
            free(p2);
            rem--;
            cout<<num<<"号车辆已经从等待区离开,当前还有"<<rem<<"辆车在等待区"<<endl<<endl;
        }
    }
}
void enterqueue(Que &Q,int num) //入队操作
{
    Que p=new Queue;
    p->data=num;
    Que k=Q;
    while(k->next) k=k->next;
    k->next=p;
    p->next=NULL;
    rem++;
}
void enter(int num,Que &Q) //表示停车
{
    if(cnt<length)
    {
        vis[++top]=num;
        cnt++;
        cout<<num<<"号车辆已放入停车场中!当前有"<<cnt<<"辆车在停车场"<<endl<<endl;;
    }
    else
    {
        enterqueue(Q,num);
        cout<<num;
        cout<<"号车辆已经进入等待区,当前共有"<<rem<<"辆等待车辆"<<endl<<endl;;
    }
}

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验二 停车场管理 班级: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,便于测
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值