停车场管理(栈和队列的应用)

二、停车场管理(栈和队列的应用)
[问题描述]
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
[实现提示]
以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。

3、 算法设计
算法思想
建立两个栈一个作为停车场,另一个作为临时栈,建立一个队列。使用栈和队列的配合使用,进行停车场的建立,栈以顺序存储结构实现,队列以链表结构实现。首先在栈空的时候,使车辆进栈,保存车辆的进栈信息,以及输入时间和代码,当栈的指针指向栈顶,及大于stack[MAX+1]时,那么以后的车就先进入便道,当停车场的车有离开的时候,那么在该车以后的车在p++的引导下,相继开出停车场并进入临时栈,当该车开出的时候,那么刚才出去的车在按照先前的次序依次进栈,再把先前停在便道上的车按次序进栈。定义栈的顺序存储结构和队列的链式存储结构,同时定义栈顶指针top和栈底指针base。然后初始化栈,同时定义在停车时的停车时间time和所需要的费用mony的关系当车进入的时候栈顶元素+1,在当车进来的时候在+1,直到空间不足,当车进来的时候显示停车场已经停满,要停到便道上,便道元素+1;当停车场的车出来一辆之后,便道上的车才能进入停车场,队列元素减1,栈元素加1。而离开的车辆则输出离开的时间,调用计费函数,进行停车费的计算。

流程图

int InitStack(StackCar *S) //初始化栈
int InitQueue(QueueCar *Q) //初始化队列
int Push(StackCar *S,CarNode *p) //进栈操作
int Pop(StackCar S,CarNode (&p)) //出栈操作
int EnQueue(QueueCar *Q,CarNode *p) //进队列操作
int DeQueue(QueueCar Q,CarNode (&q)) //出队列操作
void PriceCal(CarNode *p,int Location) //价格计算
void InCarPark(StackCar *Enter,QueueCar *Q) //进停车站
void OutCarPark(StackCar *Out,StackCar *Temp,QueueCar *Q)
void DisplayStack(StackCar *S) //显示停车站的停车情况
void DisplayQueue(QueueCar *Q) //显示便道的停车情况
int main() //主函数 对以上函数的进行调用执行

                      main主函数

车辆进入停车场的处理 车辆
void jinru(SqStack &S1,LinkQueue &Q) void likai(SqStack &S1,SqStack

(1)进栈Push (1)出栈Pop
(2)进队EnQueue (2)进栈Push
(3)出队DeQueue
(4)进队EnQueue

#include<iostream>
#include<iomanip>
#include<malloc.h>
using namespace std;
#define Max 3           //停车场容量
#define Price 0.10      //收费价格
#define ERROR -1
typedef struct
{
    int hour;
    int min;
}Time;
typedef struct Node
{
    char num[20];
    Time reach;
    Time leave;
}CarNode;
typedef struct stackNode
{
    CarNode *data[Max + 1];
    int top;
}StackCar;
typedef struct LinkNode
{
    CarNode *data;
    struct LinkNode *next;
}QueueNode;
typedef struct
{
    QueueNode *front;
    QueueNode *rear;
}QueueCar;




int InitStack(StackCar *S)
{
    S->top = 0;
    return 0;
}
int InitQueue(QueueCar *Q)
{
    Q->front = Q->rear = (QueueNode*)malloc(sizeof(QueueNode));
    if (!Q->front)
        exit(ERROR);
    Q->front->next = NULL;
    return 0;
}



int Push(StackCar *S, CarNode *p)
{
    S->top++;

    cout << "汽车停在停车场第" << S->top << "个位置" << endl;
loop:
    cout << "汽车到达的时间为[小时(0-23)和分钟(0-59)以空格隔开]:";
    cin >> p->reach.hour >> p->reach.min;
    while ((p->reach.hour<0 || p->reach.hour>23) || (p->reach.min<0 || p->reach.min>59))
    {
        cout << endl << "你的输入时间范围有误,请重新输入!" << endl << endl;
        goto loop;
    }

    S->data[S->top] = p;
    cout << endl << "*************汽车进入停车场成功*************" << endl << endl;
    return 0;
}
int PushStack(StackCar *S, CarNode *p)
{
    S->top++;
    S->data[S->top] = p;
    return 0;
}
int Pop(StackCar *S, CarNode *(&p))
{
    p = S->data[S->top];
    S->top--;
    return 0;
}
int EnQueue(QueueCar *Q, CarNode *p)
{
    cout << endl << "停车场车位已满,请该汽车在便道上停靠等待!" << endl;
    QueueNode *t;
    t = (QueueNode*)malloc(sizeof(QueueNode));
    if (!t)   exit(ERROR);
    t->data = p;
    t->next = NULL;
    Q->rear->next = t;
    Q->rear = t;
    cout << "************汽车在便道上停靠成功***********" << endl << endl;
    return 0;
}
int DeQueue(QueueCar *Q, CarNode *(&q))
{
    QueueNode *t;
    t = Q->front->next;
    q = t->data;
    Q->front->next = t->next;
    if (Q->rear == t)
        Q->rear = Q->front;
    free(t);
    return 0;
}
void PriceCal(CarNode *p, int Location)                   //计算价格
{
loop:
    cout << "请输入汽车离开的时间[小时(0-23)和分钟(0-59)以空格隔开]:";
    cin >> p->leave.hour >> p->leave.min;
    while ((p->leave.hour<0 || p->leave.hour>23) || (p->leave.min<0 || p->leave.min>59))
    {
        cout << "你的输入时间范围有误,请重新输入!" << endl;
        goto loop;
    }
    cout << "离开汽车的车牌号为:";
    cout << p->num << endl;
    cout << "该汽车到达的时间为:";
    cout << p->reach.hour << ":" << p->reach.min << endl;
    cout << "该汽车离开的时间为:";
    cout << p->leave.hour << ":" << p->leave.min << endl;
    cout << "该汽车应交费用为:<单位:元>";
    if ((p->leave.hour<p->reach.hour) || ((p->leave.hour == p->reach.hour) && (p->leave.min<p->reach.min)))
        cout << fixed << setprecision(2) << ((23 - p->reach.hour + p->leave.hour) * 60 + (60 - p->reach.min + p->leave.min))*Price << endl << endl;
    else
        cout << fixed << setprecision(2) << ((p->leave.hour - p->reach.hour) * 60 + (p->leave.min - p->reach.min))*Price << endl << endl;
    free(p);
}







void InCarPark(StackCar *Enter, QueueCar *Q)
{
    CarNode *p;
    p = (CarNode*)malloc(sizeof(CarNode));
    cout << "请输入到达汽车的车牌号:";
    cin >> p->num;
    if (Enter->top<Max)
    {
        Push(Enter, p);
    }
    else
    {
        EnQueue(Q, p);
    }
}
void OutCarPark(StackCar *Out, StackCar *Temp, QueueCar *Q)
{
    int Location;
    CarNode *p, *q;
    if (Out->top>0)
    {
    loop:   cout << "请输入汽车在停车场的位置<1-" << Max << ">:";
        cin >> Location;
        if (Location<1 || Location>Out->top)
        {
            cout << "停车场该车位还未停车,请重新输入!" << endl;
            goto loop;
        }
        while (Out->top>Location)
        {
            Pop(Out, p);              //Out,Out->data[Out->top];
            PushStack(Temp, p);       //Temp,Out->data[Out->top];
        }
        Pop(Out, p);
        PriceCal(p, Location);
        while (Temp->top >= 1)
        {
            Pop(Temp, p);            //Temp,Temp->data[Temp->top];
            PushStack(Out, p);       //Out,Temp->data[Temp->top];
        }
        if ((Q->front != Q->rear) && Out->top<Max)
        {
            DeQueue(Q, q);           //将队列结点t取值data赋给结点q并出队列;
            cout << "*************便道车位位置[1]的汽车将进入停车场**************" << endl;
            Push(Out, q);
        }
        else
            cout << endl << "*******便道上没有汽车,停车场没有进入新的汽车!**********" << endl << endl;
    }
    else
        cout << "***********停车场里没有汽车可以选择离去!*************" << endl << endl;
}
void DisplayStack(StackCar *S)
{
    int i;
    cout << "你需要查看的停车场停车情况如下:" << endl;
    if (S->top>0)
    {
        for (i = 1; i <= S->top; i++)
        {
            cout << "在停车场的车位位置:" << i << endl;
            cout << "该车位汽车的车牌号:" << S->data[i]->num << endl;
            cout << "到达时间:" << S->data[i]->reach.hour << ":" << S->data[i]->reach.min << endl << endl;
        }
    }
    else
        cout << endl << "停车场里没有车,所以无法显示你要查看的停车信息!" << endl << endl;
}
void DisplayQueue(QueueCar *Q)
{
    QueueNode *t;
    int i;
    t = Q->front->next;
    if (Q->front != Q->rear)
    {
        cout << "你需要查看的便道停车情况如下:" << endl;
        for (i = 1; t != NULL; i++)
        {
            cout << "在便道上的车位位置:" << i << endl;
            cout << "该车位汽车的车牌号:" << t->data->num << endl << endl;
            t = t->next;
        }
    }
    else
        cout << "便道上没有车,所以无法显示你要查看的停车信息!" << endl << endl;
}
void menu()
{
    cout << "*****************欢迎来到停车场管理系统************** " << endl << endl;
    cout << "                  1.汽车到达停车场操作                " << endl;
    cout << "                  2.汽车离去停车场操作                " << endl;
    cout << "                  3.停车场停车信息显示                " << endl;
    cout << "                  4.便道停车信息显示                  " << endl;
    cout << "                  0.退出停车场管理系统                " << endl << endl;
    cout << "******************************************************" << endl;
}
int main()
{
    StackCar S, Temp;
    QueueCar Q;
    char M;
    InitStack(&S);
    InitStack(&Temp);
    InitQueue(&Q);
    while (1)
    {
        menu();
        cout << "请输入你要选择的功能序号:";
        cin >> M;
        getchar();
        cout << endl;
        switch (M)
        {
        case '1':   InCarPark(&S, &Q);         system("pause");  system("cls");       break;
        case '2':   OutCarPark(&S, &Temp, &Q); system("pause");  system("cls");       break;
        case '3':   DisplayStack(&S);          system("pause");  system("cls");       break;
        case '4':   DisplayQueue(&Q);          system("pause");  system("cls");       break;
        case '0':   return 0;
        default: cout << "你的选择有误,此管理系统没有此项功能!" << endl << endl;
        }
    }
    system("pause");
}
  • 44
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值