鱼C论坛

 找回密码
 立即注册
查看: 3104|回复: 2

求助:停车场管理的数据结构算法,

[复制链接]
发表于 2021-1-3 00:11:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
[问题描述]
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。

[测试数据]
设n=2,输入数据为:( ‘A’,1,5),( ‘A’,2,10),(‘D’,l15),(‘A’, 3,20),(‘A’,4,25),(‘A’,5,30),( ‘D’,2,35),(‘D’,4,40),(‘B’,0,0)。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达:‘D’表示离去,‘E’表示输入结京。

[基本要求]
以栈模拟停车炀,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去:则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。根以顺序综构实现,队列以链表实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-3 00:12:13 | 显示全部楼层
我已经写了一个,但是输出来的数据和要求跟我要的有些偏差,不知道怎么改了,求助大佬给我解答一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-3 00:12:44 | 显示全部楼层
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int ElemType;
#define MaxSize 100
#define QNODE struct QNode

typedef struct Node //车辆信息
{
        char AL;
        int NO;//等待名次
        int time;//停车时间
}Node;

typedef struct Stack //栈定义
{
        struct Node data[MaxSize];
        int top;
        int num;
}SqStack;

QNODE        //队列节点
{
        struct Node data;
        QNODE *next;
};

typedef struct linkqueue    //队列结构体定义
{
        QNODE *front,*rear;
        int num;
}LinkQueue;

SqStack *Init_SeqStack() //置空栈
{
        SqStack *s;
        s=(SqStack*)malloc(sizeof(SqStack));
        s->top=-1;
        s->num=0;
        return s;
}

LinkQueue *Init_LQueue()    //创建空队列
{
        LinkQueue *q;
        QNODE *p;
    q=(LinkQueue*)malloc(sizeof(LinkQueue));
    p=(QNODE*)malloc(sizeof(QNODE));
    p->next=NULL;
    q->front=q->rear=p;
    q->num=0;
    return q;
}

int ISEmpty_SeqStack(SqStack *s) //判断栈是否为空,栈为空返回1
{
        if(s->top ==-1)
                return 1;
        else
                return 0;
}

int ISFULL_SeqStack(SqStack *s,int n) //判断栈是否已满,若栈满返回1
{
        if(s->top==n-1)
                return 1;
        else
                return 0;
}

int ISEmpty_LQueue(LinkQueue *q) //判断队列是否为空,队列为空返回1
{
        if(q->front==q->rear)
                return 1;
        else
                return 0;
}

void IN_Lqueue( LinkQueue *q,struct Node s)  //入队
{
        QNODE *p;
        p=(QNODE*)malloc(sizeof(QNODE));
        p->data=s;
        q->num++;
        p->next=NULL;
        q->rear->next =p;
        q->rear =p;
}

void Push_SeqStack(SqStack *p,struct Node s)  //入栈
{
        p->top ++;
        p->data[p->top]=s;
        p->num++;
}

int POP_SeqStack(SqStack *s,struct Node car)//出栈
{
        SqStack *p;
        int t;
        p=Init_SeqStack();
        while(s->data[s->top].NO !=car.NO)//找到车牌号为P.NO的车,
        {
                Push_SeqStack(p,s->data[s->top]);
                s->top--;
                s->num--;
        }
        t=car.time-s->data[s->top].time;
        s->top--;
        s->num--;
        while(ISEmpty_SeqStack(p)==0)
        {
                Push_SeqStack(s,p->data[p->top]);
                p->top--;
                p->num--;
        }
        return t;
}

struct Node Out_LQueue(LinkQueue *q)  //出队
{
        QNODE *p;
        p=q->front->next;
        q->front->next=p->next;
        q->num --;
        if( q->front->next==NULL)
                q->rear=q->front;
        return p->data;
        free(p);
}

int main()
{
        SqStack *parkstack;  //parkstack停车场栈
        LinkQueue *parkqueue;    //parkqueue等待位置队列
        struct Node car;
        int n,a=0,t;        //n停车场栈最大容量
        int menu=0;
        int change=1;
        int x;
        float f;          //f收费
        parkstack=Init_SeqStack();
        parkqueue=Init_LQueue(); //初始界面
        printf("***************停车场信息查询***************\n");
        printf("请输入停车场最大容量:");
        scanf("%d",&n);
        printf("\n请输入停车每分钟收取费用:");
        scanf("%f",&f);
       
        printf("主菜单\n");
        printf("1.停车\n");
        printf("2.取车\n");
        printf("3.查看停车场情况\n");
        printf("4.查看等待队列情况\n");
        printf("请选择:");
        while(change==1){
        scanf("%d",&menu);
        switch(menu){
        case 1:
                menu=1;
                for(x=1;x<=n;x++){
                printf("\n请输入停入的车辆信息\n");
                scanf("%c,%d,%d",&car.AL,&car.NO,&car.time);
               
                if(ISFULL_SeqStack(parkstack,n)==1) //栈满的情况
                        {
                                IN_Lqueue(parkqueue,car);  //进入队列等待
                                printf("这辆车在停车场外第%d个位置等待中...\n",parkqueue->num);
                        }
                if(ISFULL_SeqStack(parkstack,n)==0){
                                Push_SeqStack(parkstack,car); //入栈
                                printf("这辆车已停入停车场,在停车场内第%d个位置\n",parkstack->num);
       
                        }
                }
                break;
        case 2:
                menu=2;
                printf("请输入你要取的车:\n");
                scanf("%c,%d,%d",&car.AL,&car.NO,&car.time);
                t=POP_SeqStack(parkstack,car);//出栈
                printf("这辆车停留时间为%d,收费为%f。\n",t,f*t);
                printf("\n");
                break;
        case 3:
                menu=3;
                printf("\n当前的车辆有:");
                printf("停车场的车数为%d\n",parkstack->num);
                printf("\n");
                break;
        case 4:
                menu=4;
                printf("当前的等待队列有:");
                printf("候车场的车数为%d\n",parkqueue->num);
                printf("\n");
                break;

                default:
                        break;
                }
        }
        return menu;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表