【C语言】模拟狭窄停车场管理,使用栈和队列实现

本文介绍了使用栈和队列来管理一个狭长的停车场,当停车场满时,车辆会在路边排队等待。通过车辆的入库(A)、出库(D)操作,结合栈和队列的数据结构进行模拟管理。主要涉及入库判断、车满处理和出库操作。
摘要由CSDN通过智能技术生成

使用栈和队列实现的狭长停车场管理


1、情况说明:
(1)停车场结构为一条狭长的通道(可视为栈)。
(2)若停车场内车辆已经停满,后来的车需要在路边排队等待,库内有车出来才能入库    (可视为队列)。
(3)使用A代表入库,D代表出库,车辆信息包括入库时间和车牌。


2、数据定义

#define M 3//车库能停几辆车,在这里定义
//-----------------///--------------------///--------------------//
typedef struct {
    int num;
    int ID;
    int arrivetime;
}carinformation;
//定义停车场的结构体
typedef struct parkinglot {
    carinformation stack[M];
    int top;
}carpark;//定义栈结构
//-----------------///--------------------///--------------------//
//--------------------///--------------------///--------------------//
typedef struct carnode {
    int num;
    int ID;
    int arrivetime;
    //struct node *next;
}qptr;
//定义外面狭长路的队列
typedef struct {
    qptr *front, *rear;
}carqueue;
//--------------------///--------------------///--------------------//


3、初始化栈和队列函数

carpark *initstack()
{
    carpark *T;
    T = (carpark *)malloc(sizeof(carpark));
    if (T == NULL)
    {
        /*地址分配错误直接退出程序,不能继续了*/
        system("cls");
        printf("\n\n\t因为内存空间问题,导致程序出错!即将退出!\n\n");
        system("pause");
        exit(0);
    }
    T->top = -1;
    return T;
}
//初始化停车场
carqueue *initqueue()
{
    carqueue *L;
    L = (carqueue *)malloc(sizeof(carqueue));
    L->front = (carqueue *)malloc(sizeof(carqueue));
    if (L == NULL||L->front == NULL)
    {
        /*地址分配错误直接退出程序,不能继续了*/
        system("cls");
        printf("\n\n\t因为内存空间问题,导致程序出错!即将退出!\n\n");
        system("pause");
        exit(0);
    }
    if (L->front == NULL);
    L->front->next = NULL;
    L->rear = L->front;
    return L;
}
//初始化路边停车位

4、算法实现
先上代码后解释:

/*
下面是整个程序的核心内容
主要实现了进入车库和路边等待的调用
两个表的地址需要传过来
车库表和路边队列表;
carinter(char _array, int num, int time,carpark *P,carqueue *L)
carinter(进库还是出库char A/D ,车牌号int , 到达时间int ,carpark *P 车库表 ,carqueue *L 路边表)
*/
int carinter(char _array, int num, int time,carpark *P,carqueue *L)
{
    if (_array == 'A')
    {
        if (parkfull(P) == 1)
        {
            int temp;
            //这里写车库满后进入队列的code
            printf("\t车牌为:%d的车辆,已进入路边等待!\n\n",num);
            temp = carroadsaid(time, num, L);
            if (temp == 0)
            {
                /*地址分配错误直接退出程序,不能继续了*/
                system("cls");
                printf("\n\n\t因为内存空间问题,导致程序出错!即将退出!\n\n");
                system("pause");
                exit(0);
            }
            return 1;
        }
        else
        {
            int _top;
            printf("\t车牌为:%d的车辆,已进入车库!\n\n",num);
            _top = ++P->top;
            P->stack[_top].arrivetime = time;
            P->stack[_top].ID = num;
            P->stack[_top].num = internum++;
            return 1;
        }
    }
    else if (_array == 'D')
    {
        //这里是出库code
        outparking(num, time, P, L);
        return 2;//返回2,不清楚是否成功,只是返回一个数,错误在函数内判断
    }
    else//读取的char是个非法值,所以返回错误
    {
        return 0;
    }
}


解释:
(1)函数调用方法为:
carinter(char _array, int num, int time,carpark *P,carqueue *L)
第一个参数char _array为车辆是进入还是出去,第二个参数num是车牌号,第三个time是到达/离去时间(假设为int),后面两个参数为栈表和队列表的地址。
(2)首先判断_array是 A 入库还是 D 出库。如果为入库,就再接一个IF判断函数用于判出库是否已满(栈是否满),车满判断函数如下:

int parkfull(carpark *P)
{
    if (P->top == M - 1)
        return 1;
    else
        return 0;
}
//车满判断

如果车位没有满,就执行上面入库核心代码else里面的函数直接执行入栈操作。ps:车满是if内的,未满写在了else里面。
(3)对于库满的操作:
调用入队操作函数,carroadsaid(),参数明白撒~

/*
路边等待队列分配
carroadsaid(int time, int ID, carqueue *L)
carroadsaid(时间, 车牌, carqueue *L 队列表)
问题描述:利用堆栈和队列实现一个停车场管理系统 基本要求: 设停车场是一个可以停放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、付费专栏及课程。

余额充值