基于数据结构中的队列与栈实现的停车场管理程序

这是是停车场管理程序主要运用了数据结构中的队列与栈的组合

先来看看效果:


#include <iostream>
#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#include "Stack.cpp"
#define MaxSize 20///控制停车场停车的车辆数
typedef int ElemType;
int  h=0;///用来记录停车场停几辆车
ElemType e;
int k=0;///记录结构体的次序
int sa=2;
int h_wait=0;
struct Time
{
    int id;
    int hour;
    int Minute;
    int Second;
} tm[100];
typedef struct
{
    ElemType data[MaxSize];
    int front,rear;

} SqQueue;
///初始化栈
void InitQueue(SqQueue *&q)
{
    q = (SqQueue *)malloc(sizeof(SqQueue));
    q ->front=q ->rear=0;
}
void DestoryQueue(SqQueue *&q)
{
    free(q);
}
bool QueueEmpty(SqQueue *q)
{
    return q ->front==q ->rear;
}
bool enQueue(SqQueue *&q,ElemType e)
{
    if((q ->rear+1)%MaxSize==q ->front)
        return false;
    q ->rear=(q ->rear+1)%MaxSize;
    q ->data[q ->rear]=e;
    return true;
}
bool deQueue(SqQueue *&q,ElemType &e)
{
    if(q ->front==q ->rear)
        return false;
    q ->front=(q ->front+1)%MaxSize;
    e =q ->data[q ->front];
    return true;
}
int QueueLength(SqQueue *q)
{
    return (q ->rear-q ->front+MaxSize)%MaxSize;
}
void display(SqQueue *q)
{
    system("cls");

    for(int i=1; i<=h_wait; i++)
        printf("\t\t  车牌号:%d ",q ->data[i]);
    printf("\n");
    printf("\n\t\t  ***************************************\n");
    printf("\t\t  *            一共有%d辆车              *",h_wait);
    printf("\n\t\t  ***************************************\n");
}
int GetTimeHour()///得到当前的小时
{
    SYSTEMTIME sys;
    GetLocalTime( &sys );
    return sys.wHour;
}
int GetTimeSecond()///得到当前的秒
{
    SYSTEMTIME sys;
    GetLocalTime( &sys );
    return sys.wSecond;
}
int GetTimeMinute()///得到当前的分钟
{
    SYSTEMTIME sys;
    GetLocalTime( &sys );
    return sys.wMinute;
}
void EnterStation(SqQueue *&q,SqStack *&s)///进入停车场
{
    int number;
    int a,b;///b代表车牌号
    /*
    **通过h来判断停车区是否已经满啦,
    **若h>=20进入候车区
    */
    if(h>=3)
    {
        printf("停车场的停车位已满,请选择:\n");
        printf(" 1:进入候车区    2:退出   \n");
        scanf("%d",&a);
        if(a==1)
        {
            printf("请输入车辆的车牌号:\n");
            scanf("%d",&b);
            enQueue(q,b);///让车辆进入队列
            h_wait++;
            system("cls");
            printf("\n\t\t  ***************************************\n");
            printf("\t\t  *恭喜你车牌号为%d的车辆进入候车场成功*",b);
            printf("\n\t\t  ***************************************\n");
            //lang();///返回主菜单
        }
        if(a==2)
        {
            exit(0);
        }

    }
    else
    {
        ///进入停车场
        printf("请输入车辆的车牌号:\n");
        scanf("%d",&b);
        Push(s,b);
        ///引入结构体来记录车辆的车牌号和时间
        tm[k].id=b;
        tm[k].Second=GetTimeSecond();
        tm[k].Minute=GetTimeMinute();
        tm[k].hour=GetTimeHour();
        k++;
        h++;
        system("cls");
        printf("\n\t\t  ***************************************\n");
        printf("\t\t  *恭喜你车牌号为%d的车辆进入停车场成功*",b);
        printf("\n\t\t  ***************************************\n");
    }
}
void Stackdisplay(SqStack *s)
{
    int a[100],b;
    for(int i=0; i<h; i++)
    {
        Pop(s,b);
        a[i]=b;
        printf("%d ",b);
    }
    for(int i=0; i<h; i++)
    {
        Push(s,a[i]);
    }
}
void ExitStation(SqQueue *&q,SqStack *&s)///退出车站
{
    int number;
    int sum,m1,k1=0,f=0;
    int b[100],h1=0,m=0;///用来记录先退出车站的车牌号,但不是离开车站的
    if(StackEmpty(s))
    {
        printf("对不起,停车区为空\n");
    }
    else
    {
        Stackdisplay(s);///展示出当前停车区的所有车辆的信息
        printf("\n请输入要出停车区的车牌号:");
        for(int i1=0;; i1++)
        {
            scanf("%d",&number);
            for(int j=0; j<h; j++) ///用来判断是否存在该车牌
            {
                if(number==tm[j].id)
                {
                    k1=1;
                    break;
                }
            }
            if(k1==1)
            {
                for(int i=0;; i++)
                {
                    /*
                    **先让每个不是此车牌号的车出站
                    **如果number与e相等则停止出站
                    */
                    h--;
                    Pop(s,m);
                    if(number==m)
                    {
                        ///用来计算车出车站时要交的费用
                        for(int j=0; j<k; j++)
                        {
                            if(tm[j].id==number)
                            {
                                sum=(GetTimeMinute()*60+GetTimeSecond())-(tm[j].Minute*60+tm[j].Second);
                                tm[j].id=-1;///让此时的车牌号标记为空
                                break;
                            }
                        }
                        printf("请你交费%d\n",sum*sa);
                        printf("请输入你的金额");
                        scanf("%d",&m1);
                        printf("找你%d\n",m1-sum*sa);
                        printf("祝你一路顺风");
                        break;
                    }
                    else
                    {
                        b[h1++]=m;
                    }
                }
                for(int i=0; i<h1; i++)
                {
                    Push(s,b[i]);
                    h++;
                }
                if(!QueueEmpty(q))///判断此时的候车区是否为空
                {
                    deQueue(q,e);///出候车区
                    h_wait--;
                    Push(s,e);///进停车区
                    tm[k].id=e;
                    tm[k].Second=GetTimeSecond();
                    tm[k].Minute=GetTimeMinute();
                    tm[k].hour=GetTimeHour();
                    k++;
                    h++;
                }
                f=0;
            }
            else
            {
                printf("你输出的车牌号有误,请重新输入\n");
                f=1;
            }
            if(f==0)///用来判断是否走出这个循环
            {
                break;
            }
        }
    }
}
void InquiryConsumption(SqQueue *&q,SqStack *&s)
{
    system("cls");
    printf("\n\t\t  车牌号  进场时间 现在时间 消费金额\n");
    for(int i=0; i<k; i++)
    {
        int sum=(GetTimeMinute()*60+GetTimeSecond())-(tm[i].Minute*60+tm[i].Second);
        if(tm[i].id!=-1)
        {
            printf("\t\t   %d    %d:%d:%d %d:%d:%d    %d\n",tm[i].id,tm[i].hour,tm[i].Minute,tm[i].Second,
                   GetTimeHour(),GetTimeMinute(),GetTimeSecond(),sum*sa);
        }

    }
}
void menu()
{
    printf("\n\n\t\t\t   欢迎使用停车场管理系统\n\n");
    printf("\t\t\t***************************\n");
    printf("\t\t\t*         主菜单         *\n");
    printf("\t\t\t***************************\n\n");
    printf("\t\t              1 车辆进站   \n");
    printf("\t\t              2 车辆出站   \n");
    printf("\t\t              3 消费查询   \n");
    printf("\t\t              4 查询数量(候车场)   \n");
    printf("\t\t              5 退出系统\n");
    printf("\t\t           请选择[1/2/3/4/5/]:\n");
}
int main()
{
    int j;
    SqStack *s;
    SqQueue *q;
    int a=2,b=3,c=4,d=5;
    InitStack(s);
    InitQueue(q);
    while(1)
    {
        //system("cls");
        menu();
        scanf("%d",&j);
        switch(j)
        {
        case 1:
            EnterStation(q,s);
            break;
        case 2:
            ExitStation(q,s);
            break;
        case 3:
            InquiryConsumption(q,s);
            break;
        case 4:
            display(q);
            break;
            case 5:
            exit(0);
        default:
            printf("输入错误,请重新输入!\n");
        }
    }
    return 0;
}

以上的是一个主函数,下面是个头文件

#include <iostream>
#define MaxSize 20
#include <malloc.h>
#include<string.h>
#include<stdio.h>
typedef int ElemType;
using namespace std;
typedef struct sqStack
{
    ElemType data;
    struct sqStack *next;
} SqStack;
///初始化栈
void InitStack(SqStack *&s)
{
    s=(SqStack *)malloc(sizeof(SqStack));
    s ->next=NULL;
}
void DestoryStack(SqStack *&s)
{
    SqStack *p=s,*q=s ->next;
    while(q!=NULL)
    {
        free(p);///先释放p节点,及刚开始释放头结点
        p=q;///p往后移动
        q=p ->next;///q往后移
    }
    free(p);
}
bool StackEmpty(SqStack *s)
{
    return s ->next==NULL;
}
void Push(SqStack *&s,ElemType e)
{
    SqStack *p                                             ;
    p=(SqStack *)malloc(sizeof(SqStack));
    p ->data=e;
    p ->next=s ->next;
    s ->next=p;

}
bool Pop(SqStack *&s,ElemType &e)
{
    SqStack *p;
    if(s ->next==NULL)
        return false;
    p=s ->next;
    e=p ->data;
    s ->next=p ->next;
    free(p);
    return true;
}
bool GetTop(SqStack *&s,ElemType &e)
{
    if(s ->next=NULL)
        return false;
    e=s ->next->data;
    return true;
}

大致就这样

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述:利用堆队列实现一个停车场管理系统 基本要求: 设停车场是一个可以停放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)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值