停车场管理

2023-11-12

停车场管理

1.项目简介
设停车场是一个可以停放n辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场内停留的时间。
2.设计思路
停车场的管理流程如下:
①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。

②当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。
3.数据结构
由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。因此,本题求解过程中需用到两个栈和一个队列。栈以顺序结构实现,队列以顺序结构或链表结构实现。
4.程序清单
程序提示:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
参考代码:

//模拟停车场的堆栈的性质;
typedef struct zanlind{     
   int number;   //汽车车号
   int ar_time;   //汽车到达时间
}zanInode;
typedef struct{
   zanInode   *base;   //停车场的堆栈底
  zanInode   *top;   //停车场的堆栈顶
  int stacksize_curren;
}stackhead;

//模拟便道的队列的性质;
typedef struct duilie{     
   int number;     //汽车车号
   int ar_time;     //汽车到达时间
  struct duilie *next;
}*queueptr;
typedef struct{
   queueptr front;   //便道的队列的对头
   queueptr rear;   //便道的队列的队尾
   int length;
}linkqueue;

程序主要功能:

  • 车辆到达;车辆离开;计算停车费用;查询车辆信息;输出车辆信息。

函数之间的调用关系:

1.调用函数void InitStack (SeqStackCar *); 初始化栈模拟停车场。

2.调用函数int InitQueue (LinkQueueCar *) ; 初始化队列模拟便道。

3.调用函数int Arrival (SeqStackCar *, LinkQueueCar *); 车辆到达。

4.调用函数void Leave (SeqStackCar *, SeqStackCar *, LinkQueueCar *); 车辆离开。

5.调用函数void List (SeqStackCar, LinkQueueCar); 显示存车信息。

6.调用函数void PRINT (CarNode*p) ;打印信息。

详细设计

1.车辆到达

if (Enter->top<MAX) /*车场 未满,车进车场*/
{ Enter->top++;
printf ("\n\t\t\t该车辆在停车场的位置是: %\n",Enter->top);
printf(" \n\t\t\t请输入该车辆到达的时间: ") ;
scanf ("%d", & (p->reachtime));
Enter->stack[Enter->top]=p;
return(1) ;
}
else


2.车辆离开

if (Enter->top>0) /*有车*/

{ while(1) /*输入离开车辆的信息*/

{ printf(" \t\t\t停车场里停放的车辆总数: %d", Enter->top) ;

printf(" \n\n\t\t\t请输入要离开车辆的位置: ") ;
scanf ("%d" , &room) ;

if (room>=1&&room<=Enter->top)
break;}
while (Enter->top>room) /*车辆离开*/



3.主函数

while(1)
{ scanf("%d" , &ch) ;
printf("\n") ;
if (ch>= 1&&ch<=4) break;
else
printf("\n\t\t\t错误!请再次做出选择! \n\n\t\t\t");}
switch (ch)

{ case 1:Arrival (&Enter, &Wait) ; break; /*车辆到达*/case 2: Leave (&Enter, &Temp, &Wait) ; break; /*车辆离开
*/
case 3:List (Enter, Wait); break; /*列表打印信息*/
case 4:exit(0) ;
/*退出主程序*/
default: break; }

带注释的源程序:

#include<stdio.h>
#include<stdlib.h>

#include<string.h>

#define MAX 2 /*车库容量*/

#define price 3 /*每车每时刻费用*/
typedef struct node
{ int num;

int reachtime;

int leavetime;

}CarNode; /*车辆信息结点*/

typedef struct NODE

{ CarNode *stack [MAX+1];

int top;
} SeqStackCar; /* 模拟车站*/
typedef struct car

{CarNode *data;

struct car *next ;

} QueueNode;

typedef struct Node

{ QueueNode *head;

QueueNode *rear ;
}LinkQueueCar; /*模拟通道*/

/*函数声明部分*/

void InitStack (SeqStackCar *); /*初始化栈*/

int InitQueue (LinkQueueCar *) ; /*初始化便道*/

int Arrival (SeqStackCar *, LinkQueueCar *); /*车辆到达*/

void Leave (SeqStackCar *, SeqStackCar *, LinkQueueCar *); /*车辆离开*/

void List (SeqStackCar, LinkQueueCar); /*显示存车信息*/
void PRINT (CarNode*p) ;

int main()

{ SeqStackCar Enter, Temp;

LinkQueueCar Wait;

int ch;
InitStack (&Enter); /*初始化车站*/

InitStack (&Temp); /*初始化让路的临时栈*/
InitQueue (&Wait); /*初始化通道*/

while(1)

{

printf(" \n\n\t\t\t1.车辆到达请选择1");
printf("\n\n\t\t\t2.车辆离开请选择2");
printf(" \n\n\t\t\t3.车辆信息请选择3");
printf("\n\n\t\t\t4.退出程序请选择4");
printf("\n\n\t\t\t现在请选择以上信息: ");

while(1)

{ scanf("%d" , &ch) ;

printf("\n") ;

if (ch>= 1&&ch<=4) break;

else

printf("\n\t\t\t错误!请再次做出选择! \n\n\t\t\t");}

switch (ch)

{ case 1:Arrival (&Enter, &Wait) ; break; /*车辆到达*/case 2: Leave (&Enter, &Temp, &Wait) ; break; /*车辆离开

*/

case 3:List (Enter, Wait); break; /*列表打印信息*/
case 4:exit(0) ;

/*退出主程序*/

default: break; }
}
}
void InitStack (SeqStackCar *s) /*初始化栈*/
{
int i;

s->top=0;

for(i=0;i<=MAX;i++)

s->stack[s->top]=NULL;
}

int InitQueue (LinkQueueCar *Q) /*初始化便道*/

{Q->head= (QueueNode *) malloc (sizeof (QueueNode)) ;
if (Q->head!=NULL)

{Q->head->next=NULL;

Q->rear=Q->head;

return(1) ;
}
else

return(-1) ;
}
void PRINT (CarNode *p) /*打 印出站车的信息*/
{int A1, A2;
printf ("\n\t\t\t请输入离开时间: ") ;

scanf(" %d" , &(p->leavetime)) ;

printf("\n\t\t\t离开车辆的车牌号: %d",p->num) ;

printf ("\n\n\t\t\t离开车辆到达时间: %d", p->reachtime) ;
printf("\n\n\t\t\t离开车辆离开时间: %d" , p->leavetime) ;
A1=p->reachtime;

A2=p->leavetime;

printf(" \n\n\t\t\t停车场管理费用: %d", (A2- -A1) *price) ;free(p);
}
int Arrival (SeqStackCar *Enter, LinkQueueCar *W) /* 车辆到达*/

{ CarNode *p;

QueueNode *t ;

p= (CarNode *) malloc (sizeof (CarNode)) ;



printf("\t\t\t请输入到达车辆车牌号: ");
scanf ("%d", & (p->num));

if (Enter->top<MAX) /*车场 未满,车进车场*/

{ Enter->top++;

printf ("\n\t\t\t该车辆在停车场的位置是: %\n",Enter->top);
printf(" \n\t\t\t请输入该车辆到达的时间: ") ;

scanf ("%d", & (p->reachtime));

Enter->stack[Enter->top]=p;

return(1) ;

}

else

/*车场已满,车进便道*/

{ printf(" \n\t\t\t停车场已满 该车辆需在便道上等待! ");getchar() ;

t= (QueueNode *) malloc (sizeof (QueueNode)) ;
t->data-p;

t->next-NULL;

W->rear->next=t;W->rear=t;

return(1) ;
}
}

void Leave (SeqStackCar *Enter, SeqStackCar *Temp, LinkQueueCar*W) /*车 辆离开*/

{ int room;

CarNode *p, *t;

QueueNode *q;
/*判断车场内是否有车*/

if (Enter->top>0) /*有车*/

{ while(1) /*输入离开车辆的信息*/

{ printf(" \t\t\t停车场里停放的车辆总数: %d", Enter->top) ;

printf(" \n\n\t\t\t请输入要离开车辆的位置: ") ;
scanf ("%d" , &room) ;

if (room>=1&&room<=Enter->top)

break;}
while (Enter->top>room) /*车辆离开*/

{Temp->top++;

Temp->stack [Temp->top] =Enter->stack [Enter->top];
Enter->stack [Enter->top]=NULL;

Enter->top-- ;
}
p=Enter->stack [Enter->top];
Enter->stack [Enter->top]=NULL;
Enter->top-- ;

while (Temp->top>=1)

{Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack [Temp->top]=NULL;

Temp->top-- ;
}
PRINT(p) ;

/*判断通道上是否有车及车站是否已满*/

if((W->head!=W->rear)&Enter->top<MAX) /*便道的车辆进入车场*/
{ q=W->head->next;

t=q->data;
Enter-> top++;

printf("\n\n\t\t\t便道的%d号车进入车场第%d位置", t->num, Enter->top) ;

printf(" \n\n\t\t\t靖輸入現在的吋同:");
scanf ("%d", & (t->reachtime)) ;

W->head->next=q->next;

if(q==W->rear)

W->rear-W->head;

Enter->stack [Enter->top]=t;

free (q) ;
}
else
printf(" \n\n\t\t\t便道里没有车. \n");

}

else

printf(" \n\n\t\t\t车场里没有车."); /*没车*/
}
void List1 (SeqStackCar *S) /*列表 显示车场信息*/
{ int i;

if(S->top>0) /*判断车站内是否有车*/

{ printf(" \n\t\t\t车场:") ;

printf("\n\n\t\t\t位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)

{printf("%26d", i);

printf("%6d", S->stack[i]->reachtime) ;
printf("%10d", S->stack[i]->num) ;

printf("(n");

}
}
else

printf(" \n\t\t\t车场里没有车");
}
void List2 (LinkQueueCar *W) /*列表显示便道信息*/
{QueueNode *p;
p=W->head->next;
if (W->head!=W->rear) /*判断通道.上是否有车*/
{ printf("\n\t\t\t等待车辆的号码为: ");
while (p!=NULL)

{ printf("%- 10d", p->data->num) ;
p=p->next;

}

printf("\n") ;
}
else
printf("\n\t\t\t便道里没有车.");
}
void List (SeqStackCar S, LinkQueueCar W)

{ int flag, tag;

flag=1;

while(flag)

{ printf("\n\t\t\t请选择 1|2|3:");

printf("\n\n\t\t\t1. 车场\n\n\t\t\t2. 便道\n\n\t\t\t3. 返回\n\n\t\t\t");

while(1)

{scanf("%d" , &tag) ;

if (tag>=1||tag<=3) break;

else printf("\n\t\t\t请选择1|2|3:") ;
}

switch (tag)

{ case 1:List1(&S) ;break; /*列表显示车场信息*/
case 2:List2 (&W) ; break;
 /*列表显示便道信息*/
case 3:flag=0; break;

default: break;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

停车场管理 的相关文章

随机推荐

  • ubuntu搭建android编译环境

    本文来自linux与嵌入式技术Q群52240781 ubuntu12 04 14 04安装后搭建android编译环境 注安装的是64位ubuntu系统12 04或14 04 请安装ubuntu的LTS版即12 04或14 04 每2年发布
  • 87_BigDecimal的doubleValue()、toString()、toPlainString()与科学计数法

    主题 BigDecimal toPlainString 可以避免出现科学计数法格式的数据 项目上面有个小伙伴在用Bigdecimal进行数值计算时 用return num doubleValue 的方式将结果送到前台 测试数值较小时无问题
  • 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

    报错如下 检查npm目录下是否还有node exe文件如果没有复制过来 我复制过来问题解决 首先我是node和npm版本和项目版本不适应 需要更换版本 所以重新安装node js在重新安装的过程中将安装的位置改变了 所以造成了这个可能
  • DSS简介

    原文链接 去中心化软件服务 DSS 是一个基于CCR的轻量级 net运行时环境 DSS提供了一个轻量级的 状态导向的服务模型 它将REST概念和构造高性能高扩展性应用的系统级方法结合在一起 在DSS中服务被暴露为一种可以被程序和UI操作界面
  • 将 Tocmat5.0 注册为 Windows 的服务程序

    将 Tocmat5 0 注册为 Windows 的服务程序 步骤 1 下载 Tomcat 5 0 x 不要下载安装版本 2 解压到 TOMCAT HOME 3 安装或者从别处拷贝JRE 推荐拷贝 可以删除不需要的文件 如文档等 4 在 TO
  • Qt编译MySQL数据库驱动

    文章目录 一 我的编译环境 二 需要 三 Qt的下载 四 编译驱动 主题 4 1 第一步打开msql pro 4 2 第二步 4 3 第三步 4 4 第四步 4 5 第五步 编译 最后一步 一 我的编译环境 Qt 5 14 2 mingw7
  • 大模型时代,企业如何重构 AI 应用落地范式?

    近一年来 生成式人工智能 AIGC 技术的快速发展和各种大模型的涌现 引发了全球范围内对于通用人工智能 AGI 时代是否即将到来的讨论 在 AIGC 大模型公共服务逐渐被大众辩证地接受后 如何用 AIGC 技术重塑企业智能服务成为一个深水区
  • 使用Jmeter进行http接口做功能、性能测试

    使用Jmeter进行http接口做功能 性能测试 1 使用Jmeter进行http接口做功能 性能测试 在测试移动APP时 会有很多接口需要做测试 我在这里介绍一下对HTTP接口做功能 性能的测试 首先我们会从开发人员拿到接口数据 1 1
  • 苹果IOS开发者账号总结

    详细地址 https developer apple com programs which program 个人账号 Individual 费用99美金一年 该账号在App Store销售者只能显示个人的ID 比如zhitian zhang
  • Linux 查看进程消耗内存情况总结

    在Linux中 有很多命令或工具查看内存使用情况 今天我们来看看如何查看进程消耗 占用的内存情况 Linux的内存管理和相关概念要比Windows复杂一些 在此之前 我们需要了解一下Linux系统下面有关内存的专用名词和专业术语概念 物理内
  • LeetCode之最长公共子序列问题LCS解决方法

    Leetcode官网解答 使用动态规划原理 请参考原文地址 https leetcode cn com problems longest common subsequence solution zui chang gong gong zi
  • Python机器学习--算法实现--常用算法在Sklearn中的回归算法关键参数详解

    常用算法在Sklearn中的关键参数详解 回归算法 线性回归算法 from sklearn linear model import LinearRegression LinearRegression fit intercept True n
  • VS2008调试dump文件

    让程序在崩溃时体面的退出之Dump文件 在我的那篇 让程序在崩溃时体面的退出之CallStack 中提供了一个在程序崩溃时得到CallStack的方法 可是要想得到CallStack 必须有pdb文件的支持 但是一般情况下 发布出去的程序都
  • 网址服务器不稳定,关于网站被360搜索提示服务器不稳定可能无法正常访问的解决方法...

    相信很多做网站的站长们都有过类似的经历吧 有时候因为服务器节点问题或者其他问题导致服务器或vps暂时性无法运行导致网站暂时无法打开 这些都是属于正常的现象 但是运气不好的时候辛辛苦苦优化的网站可能就会被搜素引擎标记为 该页面因服务器不稳定可
  • 锦囊妙计--组建新团队整体规划

    详细请见幕布链接 https mubu com doc 2MicLCcsoC 幕布内的具体内容还在持续完善中 敬请期待
  • 【洛谷 P1115】最大子段和 题解(贪心算法)

    最大子段和 题目描述 给出一个长度为 n n n 的序列 a a a 选出其中连续且非空的一段使得这段和最大 输入格式 第一行是一个整数 表示序列的长度 n
  • 报错unable to access android sdk add-on list

    前言 初次安装Android Studio AS启动后 会在默认路径下检测是否有Android SDK 如果没有的话 就会报错如下 解决办法 我这里安装了sdk 然后点击cancel 下一步会自动读取我们的sdk 然后点击next就行了 如
  • OPENWRT中SSH免密钥登陆(详细步骤)

    通过使用ssh keygen生成公钥 在两台机器之间互相建立新人通道极客 假设本地机器是client 远程机器为server 1 使用ssh keygen生成rsa keygen 在这里会覆盖以前生成的 ssh id rsa文件 请提前做好
  • vue3的一些知识点plus--3

    二十 兄弟组件传值 Bus 兄弟组件直接的传值 最基础的是通过同一个父级进行数值的传递 使用prop和emit 太过繁琐 父级 div a a b b div let flag ref false let getFlag params bo
  • 停车场管理

    停车场管理 1 项目简介 设停车场是一个可以停放n辆汽车的南北方向的狭长通道 且只有一个大门可供汽车进出 汽车在停车场内按车辆到达时间的先后顺序 依次由北向南排列 大门在最南端 最先到达的第一辆车停放在车场的最北端 若车场内已停满n辆车 那