m0_64018569 2022-07-11 09:19 采纳率: 78.6%
浏览 550
已结题

数据结构:设停车场是一个可停放n辆车的狭长通道

设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若停车场内已停满n辆车,则后来的汽车需要在门外的便道上等候,当有车开走时,便道上的第一辆车即可进入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其它车辆再按原次序返回停车场。每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。试编写程序,模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。从终端读入汽车到达或离去的数据,每组数据包括三项:(1)是“到达”还是“离去”;(2)汽车牌照号码;(3)“到达”或“离去”的时间。与每组输入信息相对应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。(提示:需另设一个栈,临时停放为让路而从车场退出的车)

  • 写回答

3条回答 默认 最新

  • 关注

    C语言:建立2个顺序栈,1个链表队列,模拟车辆停放。
    运行结果如下:

    img

    代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //定义车辆信息
    typedef struct _carinfo
    {
        char id[10]; //车牌号
        int hourCome; //到达时间,时,为了简便,这里只处理同一天内的时间
        int minCome; //到达时间,分钟
        int hourLeave; //离开时间,时
        int minLeave; //离开时间,分钟
    }Carinfo;
    
    /*****************************************************定义顺序栈,栈,先进后出xqls*********************************/
    
    typedef struct _Stack
    {
        Carinfo* pcar;
        int maxlen;
        int front;
    }Stack;
    
    //初始化栈
    void Stackinit(Stack* s,int size)
    {
        s->maxlen = size;
        s->pcar = (Carinfo*)malloc(size * sizeof(Carinfo));
        s->front = 0;
    }
    //入栈
    int Stackpush(Stack* s, Carinfo c)
    {
        if (s->front >= s->maxlen)
            return 0;
        else
        {
            s->pcar[s->front] = c;
            s->front++;
            return s->front;
        }
    }
    //出栈
    int Stackpop(Stack* s, Carinfo* e)
    {
        if (s->front <= 0)
            return 0;
        else
        {
            s->front--;
            *e = s->pcar[s->front];
            return 1;
        }
    }
    
    //判断是否为空
    int Stackempty(Stack s)
    {
        if (s.front <= 0)
            return 1;
        else
            return 0;
    }
    
    
    //判断栈是否满
    int StackFull(Stack s)
    {
        if (s.front == s.maxlen)
            return 1;
        else
            return 0;
    }
    
    /*****************************************************定义链式队列,先进先出xqls*********************************/
    typedef struct _node
    {
        Carinfo car;
        struct _node* next;
    }QueueNode,*Queue;
    //初始化队列
    Queue Queueinit()
    {
        Queue head = (Queue)malloc(sizeof(QueueNode));
        head->next = 0;
        return head;
    }
    //入队
    int Queuepush(Queue q, Carinfo c)
    {
        Queue p = q;
        QueueNode* t = (QueueNode*)malloc(sizeof(QueueNode));
        int pos = 1;
    
        t->car = c;
        t->next = 0;
        while (p->next)
        {
            p = p->next;
            pos++;
        }
            
        p->next = t;
        return pos;
    }
    //出队
    int Queuepop(Queue q, Carinfo* e)
    {
        Queue p = q->next;
        if (q->next == 0)
            return 0;
        else
        {
            *e = p->car;
            q->next = p->next;
            free(p);
            p = 0;
            return 1;
        }
    }
    //判断是否为空
    int Queueempty(Queue q)
    {
        if (q->next == 0)
            return 1;
        else
            return 0;
    }
    
    
    //计算停车费xqls
    double pay(int h1, int m1, int h2, int m2,double p)
    {
        int s1 = h1 * 60 + m1;
        int s2 = h2 * 60 + m2;
        double out = (s2 - s1) / 60.0 * p;
        return out;
    }
    
    
    
    int main()
    {
        Stack parking; //停车场栈 xqls
        Stack tmp;   //临时栈 xqls
        Queue waiting; //等候队列 xqls
    
        int n; //停车场最多停放的车辆数目
        int op; //操作
        int h, m;
        int pos = 0;
        char id[10] = { 0 };
    
        double pay_perhour = 2; //每小时的停车费
    
        printf("请输入停车场最大的停车数量n:");
        scanf("%d", &n);
    
        //初始化
        Stackinit(&parking,n);
        Stackinit(&tmp,n);
        waiting = Queueinit();
    
    
    
        while (1)
        {
            printf("请输入操作:1.到达;2.离开;3.退出程序 : ");
            scanf("%d", &op);
            if (op == 2 && Stackempty(parking))
            {
                printf("停车场目前暂无车辆\n");
                continue;
            }
            printf("请输入车牌号:");
            scanf("%s", id);
            //到达
            if (op == 1)
            {
                printf("请输入到达时间(HH:MM):");
                scanf("%d:%d", &h, &m);
                Carinfo cc;
                strcpy(cc.id, id);
                cc.hourCome = h;
                cc.minCome = m;
                if (StackFull(parking))
                {
                    pos = Queuepush(waiting, cc);
                    printf("便道位置:%d\n", pos);
                }
                else
                {
                    pos = Stackpush(&parking, cc);
                    printf("停车场位置:%d\n", pos);
                }
                    
            }
            else if (op == 2)
            {
                while (1)
                {
                    //该车之后的先出栈,入临时栈
                    Carinfo cc;
                    Stackpop(&parking, &cc);
                    if (strcmp(cc.id, id) == 0)
                    {
                        printf("请输入离开时间(HH:MM):");
                        scanf("%d:%d", &cc.hourLeave, &cc.minLeave);
                        printf("缴费:%.1f\n",pay(cc.hourCome, cc.minCome, cc.hourLeave, cc.minLeave, pay_perhour));
                        break;
                    }
                    else
                    {
                        Stackpush(&tmp, cc);
                        printf("    %s入临时栈\n", cc.id);
                    }
                }
                //临时栈车辆返回
                while (!Stackempty(tmp))
                {
                    Carinfo cc;
                    Stackpop(&tmp, &cc);
                    Stackpush(&parking, cc);
                    printf("    %s返回停车场\n", cc.id);
                }
                
                //等待队列入栈
                if (!Queueempty(waiting))
                {
                    Carinfo cc;
                    Queuepop(waiting, &cc);
                    pos = Stackpush(&parking, cc);
                    printf("%s驶入停车场,位置:%d\n", cc.id,pos);
                }
    
    
            }
            else if (op == 3)
                break;
        }
        return 0;
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 创建了问题 7月11日

悬赏问题

  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 vue2登录调用后端接口如何实现