模拟停车场管理系统

问题描述:

设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。

基本要求:

以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费)。栈以顺序结构出现,队列以链表结构实现。

测试数据:

(1)连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、、JF005、JF006、JF007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。

(2)(1)中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF004的让路动作和JF006从便道到停车位上的动作。

(3)随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。

(4)程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。



 // 停车场.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <string>
#define Max 3//停车场的最大数
#define N 10
#define x 2
#define y 1

typedef struct
{
    char license[N];
    double time1,time2;
}Car;          //车辆信息
typedef struct
{
    Car *park[Max];
    int top;
}Parking;     //停车场

typedef struct Node
{
    Car *data;
    struct Node *next;
}QNode;      //链表结点
typedef struct
{
    QNode *front,*rear;
}Pavement;    //便道 链队列

Parking *Init_Parking()  //顺序栈初始化
{
    Parking *s;
    s = new Parking;//申请栈空间
    if(!s)
        return NULL;//未申请到足够大的栈空间,返回空指针
    else
    {
        s->top=-1;  
        return s;  //申请到栈空间,返回栈空间地址
    }
}
Pavement *Init_Pavement()  //链队初始化           
{                                                                                                                             
    QNode *q;
    Pavement *p;  
    q = new QNode;    //申请首尾指针结点
    p = new Pavement;  //申请链队首结点
    q->next=NULL;
    p->front=p->rear=q;
    return p;
}
void come_Car(Parking *pk,Pavement *pm){//进车
    QNode *q;
    q=new QNode;//申请新节点
    Car *c;
    c=new Car;
    cout<<"请输入车牌号:";
    cin>>c->license;
    if(pk->top==Max-1){//停车场内的车辆已满
        cout<<"停车场已满,请将车停在便道上"<<endl;
        cout<<"请输入车辆车辆停在便道上的时间"<<'\t';
        cin>>c->time1;
        q->data=c;
        q->next=NULL;
        pm->rear->next=q;//将新节点插入队尾
        pm->rear=q;//将尾指针指向新的节点
    }
    else{//停车场未满
        cout<<"停车场未满,可将车辆停在停车场内"<<endl;
        cout<<"请输入车辆进入停车场的时间"<<'\t';
        cin>>c->time1;
        pk->top++;//将栈顶指针向上移动
        cout<<"车牌号为"<<c->license<<"的车停在停车场的第"<<pk->top+1<<"的位置上"<<endl;
        pk->park[pk->top]=c;//将c置入新的栈顶
    }    
}
void leave_Car(Parking *pk,Parking *temp,Pavement *pm){//车辆离开停车场
    int position,i;
    double money1=0,money2=0;
    char num[N];
    Car *c1,*c2;
    QNode *q;
    if(pk->top>=0){//停车场里有车
        cout<<"请输入要离开的汽车的车牌号"<<'\t';
        cin>>num;
        for(i=0;i<=pk->top;i++){//找要离开的车辆在停车场中的位置
            if(strcmp(num,pk->park[i]->license)==0){
                position=i;
                break;
            }
        }
        if(i>pk->top){//如果停车场内没有车牌号为num的车辆时
            cout<<"您输入的车牌号有误,请重新输入!"<<'\t';
            cin>>num;
            for(i=0;i<=pk->top;i++){//找要离开的车辆在停车场中的位置
                if(strcmp(num,pk->park[i]->license)==0){
                    position=i;
                    break;
                }
            }

        }
        cout<<"停在停车场的"<<position+1<<"位置上的车辆要离开"<<endl;
        while(pk->top>position){//辅助栈
            temp->top++;
            temp->park[temp->top]=pk->park[pk->top];
            cout<<"车牌号为:"<<pk->park[pk->top]->license<<"的车辆需要暂时退出停车场!"<<endl;
            pk->park[pk->top]=NULL;
            pk->top--;
        }
        c1=pk->park[pk->top];
        cout<<"车牌号为:"<<c1->license<<"的车辆离开停车场!"<<endl;
        cout<<"请输入此车离开停车场的时间"<<'\t';
        cin>>c1->time2;
        money2=money1+x*(c1->time2-c1->time1);
        cout<<"该车需交费:"<<money2<<"元"<<endl;
        pk->park[pk->top]=NULL;
        pk->top--;
        while(temp->top>=0){//辅助栈中有车辆
            pk->top++;
            pk->park[pk->top]=temp->park[temp->top];
            cout<<"车牌号为:"<<pk->park[pk->top]->license<<"的车停回停车场的"<<position+1<<"的位置"<<endl;
            temp->park[temp->top]=NULL;
            temp->top--;
            position++;
        }
        if((pm->front!=pm->rear)&&(pk->top<Max)){//便道上有车并且停车场内有空位时
            q=pm->front->next;
            c2=q->data;
            pk->top++;
            cout<<"便道上车牌号为"<<c2->license<<"的车进入停车场的"<<pk->top+1<<"的位置"<<endl;
            c2->time1=c1->time2;//c1车离开停车场的时间等于c2车进入停车场的时间
            money1=y*(c2->time2-c2->time1);
            pm->front->next=q->next;
            if(q==pm->rear)
                pm->rear=pm->front;
            pk->park[pk->top]=c2;
            delete q;
        }
        else
            cout<<"便道上没有车!"<<endl;
    }
    else
        cout<<"停车场里没有车!"<<endl;
}
void pkdisplay(Parking *pk){//查询栈内信息
    int i;
    cout<<"停车场内的情况为:"<<endl;
    if(pk->top>=0){//停车场内有车时
        for(i=0;i<pk->top+1;i++){
            cout<<"车位"<<i+1<<"的位置上停有车牌号为"<<pk->park[i]->license<<"的车辆"<<endl;
        }
    }
    else
        cout<<"此时停车场内没有车!"<<endl;
}
void pmdisplay(Pavement *pm){//查询便道内的情况
    QNode *q;
    q=pm->front->next;
    int i=1;
    cout<<"便道上的情况为:"<<endl;
    if(pm->front!=pm->rear){//当便道上有车时
        while(q!=NULL){
            cout<<"位置"<<i<<"上停有车牌号为"<<q->data->license<<"的车辆"<<endl;
            q=q->next;
            i++;
        }
    }
    else
        cout<<"便道里没有车!"<<endl;
}
int main(int argc, char* argv[])
{
    int n;
    Parking *pk,*temp;
    Pavement *pm;
    pk=Init_Parking();
    temp=Init_Parking();
    pm=Init_Pavement();

    while(1)
    {
        cout<<"******停车场模拟管理******"<<endl;
        cout<<"    1、有车辆进入停车场   "<<endl;
        cout<<"    2、有车辆出停车场     "<<endl;
        cout<<"    3、查询停车场状态     "<<endl;
        cout<<"    4、查询便道状态       "<<endl;
        cout<<"    5、退出系统              "<<endl;
        cout<<endl;
        cout<<"请输入您的选择:";
        cin>>n;
        switch(n)
        {
        case 1:
            come_Car(pk,pm);
            cout<<endl;
            break;
        case 2:
            leave_Car(pk,temp,pm);
            cout<<endl;
            break;
        case 3:
            pkdisplay(pk);
            cout<<endl;
            break;
        case 4:
            pmdisplay(pm);
            cout<<endl;
            break;
        case 5:
            cout<<"成功退出系统!"<<endl;
            exit(0);
            break;
        default:
            cout<<"您的输入有误,请重新输入!"<<endl;
            break;
        }
    }
    return 0;
}


  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
问题描述:利用堆栈和队列实现一个停车场管理系统 基本要求: 设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟停车场的管理。车辆的信息包括:车牌号、汽车到达/离去标志、到达/离去时刻等。按照从终端读入的数据序列进行模拟管理。每辆车需要三个数据,其中车辆数据为:A表示到达,D表示离去,E表示程序结束。车辆牌照为整型数据。进场或离场时间同样为整型数据。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。 停车场管理系统主要实现以下几个功能: (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。 (2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。 (3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。 [测试数据] (A,1,1) (A,2,2) (A,3,3) (A,4,4) (A,5,5) (D,2,7) (A,1,8) (A,4,9)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值