(算法入门)栈和队列-停车场管理系统

一、实验目的通过停车场管理的程序设计,帮助学生熟练掌握栈和队列的基本操作及用栈与队列解决具体问题的基本方法。二、实验内容设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端);若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排
摘要由CSDN通过智能技术生成

一、实验目的

通过停车场管理的程序设计,帮助学生熟练掌握栈和队列的基本操作及用栈与队列解决具体问题的基本方法。

二、实验内容

设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。

汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端);

若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可进入;

当停车场某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场;

汽车可以直接从便道上离开。离开时排在前面的车也应该为其让道,随后应回到原来的位置。

每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。交费按车的类型不同而不同,假定小车每小时2元,客车每小时3元,卡车每小时5元。停在便道上的车也要交费,假设其费用为停车场的车的1/3

停车只限于当天0点至24点。

编写程序实现上面要求的停车场停车管理功能。

三、实验原理

1、停车场的数据逻辑表示

停车场包括正式的停车场和停车场外的暂停便道。按照要求,汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端),离开时只能从大门口离开。因此以栈模拟停车场比较合适。对栈的操作,汽车进入停车场是严格按入栈操作进行。汽车离开停车场时不一定是最接近大门的车辆,可以是停车场中的任何一辆车,所以汽车离开操作不是严格的出栈操作。但汽车离开停车场后的数据仍然按栈的方式进行组织。

由于暂停便道的车辆当停车场有空位时要进入停车场,而进入停车场的顺序是按进入便道的先后顺序进行的。因此用队列模拟停车场外的暂停便道比较恰当。

假设停车场最多可停放6辆车,初始为空,有连续9两车进入车场,则其中6辆车停在停车场,另有3辆车停在便道上,如图3-1所示。

按照从终端读入的输入数据进入模拟管理。每一组输入数据包括三个数据项:

    汽车“到达”或“离去”信息

    汽车牌照号码

    汽车到达或离去的时刻(以小时为单位记数)

对每一组输入数据进行操作后的输出信息为:

   若是车辆“到达”,则输出汽车在停车场内或便道上的停车位置。

   若是车辆“离去”,则输出汽车在车场内停留的时间和应交纳的费用。

2、汽车从停车场离开的处理

当汽车从停车场离开时,若该车就是最靠近大门的车(在栈中处于栈顶位置),则直接开出停车场。若不是最靠近大门的车(不在栈顶),则处在靠近大门的车(栈顶位置)要让道。当要离开的车离开停车场后,让道的车又要按原来的顺序进入停车场。按照让道离开顺序和重新进入停车场的顺序,符合栈操作的规律,所以需要设置一个辅助栈来保存让道的车辆信息。

对于上面车辆离开停车场的两种情况,若暂停便道上有车,则便道上排在最前面的车要进入停车场。

假设4号车要离开车场,则应按6号车、5号车的顺序依次进入让路便道。当4号车开走后,应按5号车、6号车的顺序依次进入停车场。这时停车场空出一个位置,然后7号车进入停车场。图3-2表示4号车正在离开时的情况。

3、车辆从暂停便道离开的表示

假设车辆只能向前开,而不是后退的形式离开便道。当汽车从便道离开时,若该车排在最前面,则可直接离开。若不是排在最前面,则处在前面的车要让道。让道的方式有两种方案:

1)前面的车直接开到后面去排队。如果司机都希望把汽车开到停车场停靠,显然这种处理方式式不公正的。

2)让道的车让道后回到原来排队位置(这是比较公正的处理方法)。但要实现这种处理方式必须另开辟场所停放让道车辆,在处理相关数据时,必须另设一辅助数据结构来存放前

  • 19
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个停车场管理系统是基于C语言数据结构中队列思想的,以模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。这个系统的基本要求是要求以顺序模拟停车场,以链队列模拟便道。具体的算法思想如下: 1.车辆停入停车场的流程:首先判断停车场的车位是否停满。两种情况:(1)停满时此时后来的车辆只能停在走道上 (2)未停满时后来的车辆继续入。 2.车辆出站的思想。两种情况:(1)车辆在顶时,此时直接出而用不到辅助(2)车辆不在车顶时排在前面的车辆必须让位,此时它才能出算法思想是首先根据输入的车牌号进行在中搜索,返还一个角标,根据角标来,找到出的车辆,这时前面的车辆入辅助,当循环的目标车辆时,这时不需要入辅助,直接出即可! 总体结构思路如下:这时车位停满的情况,若非顶出则需要把他前面的车让位进辅助,当目标车出的再回来。 以下是一个简单的队列停车场管理系统C语言代码的范例,仅供参考: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 #define MAXCAR 20 #define PRICE 1 typedef struct{ char num[10]; int time; }Car; typedef struct{ Car stack[MAXSIZE]; int top; }Stack; typedef struct{ Car queue[MAXSIZE]; int front,rear; }Queue; Stack park; Queue road; void InitStack(Stack *s){ s->top=-1; } int IsFull(Stack *s){ if(s->top==MAXSIZE-1) return 1; else return 0; } int IsEmpty(Stack *s){ if(s->top==-1) return 1; else return 0; } void Push(Stack *s,Car c){ if(IsFull(s)){ printf("停车场已满!\n"); return; } s->top++; s->stack[s->top]=c; } Car Pop(Stack *s){ Car temp; if(IsEmpty(s)){ printf("停车场已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=s->stack[s->top]; s->top--; return temp; } void InitQueue(Queue *q){ q->front=q->rear=0; } int IsQueueFull(Queue *q){ if((q->rear+1)%MAXSIZE==q->front) return 1; else return 0; } int IsQueueEmpty(Queue *q){ if(q->front==q->rear) return 1; else return 0; } void InQueue(Queue *q,Car c){ if(IsQueueFull(q)){ printf("便道已满!\n"); return; } q->queue[q->rear]=c; q->rear=(q->rear+1)%MAXSIZE; } Car OutQueue(Queue *q){ Car temp; if(IsQueueEmpty(q)){ printf("便道已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=q->queue[q->front]; q->front=(q->front+1)%MAXSIZE; return temp; } void Arrive(){ Car temp; printf("请输入车牌号和到达时间:\n"); scanf("%s%d",temp.num,&temp.time); if(park.top<MAXCAR-1){ Push(&park,temp); printf("停车成功!\n"); } else{ InQueue(&road,temp); printf("停车场已满,停在便道上!\n"); } } void Leave(){ Car temp; int time,cost,i,flag=0; printf("请输入车牌号和离开时间:\n"); scanf("%s%d",temp.num,&time); while(!IsEmpty(&park)){ temp=Pop(&park); if(strcmp(temp.num,num)==0){ flag=1; cost=(time-temp.time)*PRICE; printf("停车时间为%d小时,应缴纳停车费%d元!\n",time-temp.time,cost); for(i=0;i<park.top;i++){ Push(&park,Pop(&park)); } return; } else{ Push(&road,temp); } } if(flag==0){ printf("未找到该车辆!\n"); return; } while(!IsEmpty(&road)){ Push(&park,OutQueue(&road)); } } void List(){ int i; if(IsEmpty(&park)){ printf("停车场为空!\n"); return; } printf("停车场:\n"); for(i=park.top;i>=0;i--){ printf("%s %d\n",park.stack[i].num,park.stack[i].time); } if(IsQueueEmpty(&road)){ printf("便道为空!\n"); return; } printf("便道:\n"); for(i=road.front;i!=road.rear;i=(i+1)%MAXSIZE){ printf("%s %d\n",road.queue[i].num,road.queue[i].time); } } int main(){ int choice; InitStack(&park); InitQueue(&road); while(1){ printf("停车场管理系统\n"); printf("1.车辆到达\n"); printf("2.车辆离开\n"); printf("3.显示车辆信息\n"); printf("4.退出系统\n"); printf("请输入操作编号:\n"); scanf("%d",&choice); switch(choice){ case 1:Arrive();break; case 2:Leave();break; case 3:List();break; case 4:exit(0); default:printf("输入有误,请重新输入!\n"); } } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值