停车场问题
实验内容
1.问题描述:
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆达到时间的先后顺序,依次由北向南排列(大门在最南端,最先达到的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆在按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管理的模拟程序。
2.基本要求:
(1)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及达到或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆达到、则输出汽车在停车场内或便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
(2)菜单操作
测试数据
设n=2,输入数据为(“A”,1,5),(“A”,2,10),(“D”,1,15),(“A” ,3,20),(“D”,2,35),("E”,0,0),(“A”,1,5),其中 :“A”表示达到(Arrival);“D”表示离去(Departure);“E”表示输入结束(End)。
- 实现提示:
需另设一个栈,临时停放为要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包括两个数据项:汽车的牌照号码和进入停车场的时刻。
实验原理
1.车辆停入停车场的流程:
首先判断停车场的车位是否停满。两种情况:(1)停满时此时后来的车辆只能停在走道上(2)未停满时后来的车辆继续入栈。
2.车辆出站的思想。两种情况:(1)车辆在栈顶时,此时直接出栈而用不到辅助栈(2)车辆不在车顶时排在前面的车辆必须让位,此时它才能出栈,算法思想是首先根据输入的车牌号进行在栈中搜索,返还一个角标,根据角标来,找到出栈的车辆,这时前面的车辆入辅助栈,当循环的目标车辆时,这时不需要入辅助栈,直接出栈即可.
#include <stdio.h>
#include <stdlib.h> //用malloc时要声明,引入stdlib.h以使用malloc和realloc
#include <string.h> //字符串处理库,例如字符串的复制、连接、比较等 #define MAX_CARS 2 // 停车场最大容量
#define MAX_PLATE_LEN 10 // 汽车牌照最大长度// 定义汽车结构体
typedef struct {char plate[MAX_PLATE_LEN]; // 牌照号码int arrival_time; // 到达时间
} Car;// 顺序栈实现
typedef struct {Car cars[MAX_CARS]; // 停车场存放的汽车数组int top; // 栈顶指针
} Stack;// 链表节点
typedef struct Node {Car car; // 汽车struct Node* next; // 指向下一个节点
} Node;// 链表队列实现
typedef struct {Node* front; // 队首指针Node* rear; // 队尾指针
} Queue;// 初始化栈
void initStack(Stack* stack) {stack->top = -1; // 栈顶指针初始化为-1,表示栈为空
}// 判断栈是否满
int isStackFull(Stack* stack) {return stack->top == MAX_CARS - 1; // 栈满的条件
}// 判断栈是否空
int isStackEmpty(Stack* stack) {return stack->top == -1; // 栈空的条件
}// 入栈操作
void push(Stack* stack, Car car) {if (!isStackFull(stack)) { // 先检查栈是否满stack->cars[++stack->top] = car; // 将汽车入栈并更新栈顶指针}
}// 出栈操作
Car pop(Stack* stack) {if (!isStackEmpty(stack)) { // 先检查栈是否空return stack->cars[stack->top--]; // 返回栈顶汽车并更新栈顶指针}Car emptyCar = {"", 0}; // 返回一个空的汽车结构体,表示出栈失败return emptyCar;
}// 初始化队列
void initQueue(Queue* queue) {queue->front = queue->rear = NULL; // 队列前后指针初始化为NULL,表示队列为空
}// 判断队列是否空
int isQueueEmpty(Queue* queue) {return queue->front == NULL; // 队列为空的条件
}// 入队操作
void enqueue(Queue* queue, Car car) {Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点newNode->car = car; // 设置节点中的汽车信息newNode->next = NULL; // 新节点的next指针初始化为NULLif (isQueueEmpty(queue)) { // 如果队列为空queue->front = queue->rear = newNode; // 新节点既是队首又是队尾} else {queue->rear->next = newNode; // 将新节点添加到队尾queue->rear = newNode; // 更新队尾指针}
}// 出队操作
Car dequeue(Queue* queue) {if (!isQueueEmpty(queue)) { // 先检查队列是否空Node* temp = queue->front; // 暂存队首节点Car car = temp->car; // 获取队首的汽车信息queue->front = queue->front->next; // 更新队首指针free(temp); // 释放旧的队首节点if (queue->front == NULL) { // 如果队列变为空queue->rear = NULL; // 更新队尾指针}return car; // 返回出队的汽车信息}Car emptyCar = {"", 0}; // 返回一个空的汽车结构体,表示出队失败return emptyCar;
}// 查找并返回车辆在栈中的索引
int findCarInStack(Stack* stack, char* plate) {for (int i = stack->top; i >= 0; i--) { // 从栈顶向下查找if (strcmp(stack->cars[i].plate, plate) == 0) { // 找到匹配的车牌return i; // 返回车辆的索引}}return -1; // 未找到,返回-1
}// 主程序
int main() {Stack parking_lot; // 定义停车场栈Queue waiting_area; // 定义便道队列initStack(&parking_lot); // 初始化停车场initQueue(&waiting_area); // 初始化便道char command; // 命令变量Car car; // 当前处理的汽车int current_time; // 当前时间printf("请输入命令(A/D/E):\n");while (1) {scanf(" %c", &command); // 读取命令if (command == 'E') { // 如果命令是结束break; // 退出循环}scanf("%s %d", car.plate, ¤t_time); // 读取车牌和时间if (command == 'A') { // 如果是到达命令if (!isStackFull(&parking_lot)) { // 检查停车场是否已满car.arrival_time = current_time; // 记录到达时间push(&parking_lot, car); // 入栈printf("车辆 %s 停在停车场位置 %d\n", car.plate, parking_lot.top + 1);} else { // 停车场已满car.arrival_time = current_time; // 记录到达时间enqueue(&waiting_area, car); // 入队printf("车辆 %s 停在便道\n", car.plate);}} else if (command == 'D') { // 如果是离去命令int index = findCarInStack(&parking_lot, car.plate); // 查找车辆在栈中的位置if (index != -1) { // 如果找到// 将需要让路的车辆放入临时栈Stack temp_stack; // 辅助栈initStack(&temp_stack); // 初始化辅助栈for (int i = parking_lot.top; i > index; i--) { // 将需要让路的车辆入辅助栈push(&temp_stack, pop(&parking_lot)); // 从停车场出栈并入辅助栈}// 出栈目标车辆Car departed_car = pop(&parking_lot); // 目标车辆出栈int duration = current_time - departed_car.arrival_time; // 计算停留时间printf("车辆 %s 停留时间 %d,需支付费用 %d\n", departed_car.plate, duration, duration);// 将临时栈中的车辆恢复到停车场while (!isStackEmpty(&temp_stack)) {push(&parking_lot, pop(&temp_stack)); // 将辅助栈的车辆放回停车场}// 检查便道是否有车辆可以进入if (!isQueueEmpty(&waiting_area)) {Car next_car = dequeue(&waiting_area); // 从便道出队next_car.arrival_time = current_time; // 更新到达时间push(&parking_lot, next_car); // 入栈停车场printf("车辆 %s 从便道进入停车场,停在位置 %d\n", next_car.plate, parking_lot.top + 1);}} else {printf("车辆 %s 不在停车场内\n", car.plate); // 未找到车辆}}}return 0; // 程序结束
}
相关文章:

停车场问题
实验内容 1.问题描述: 设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆达到时间的先后顺序,依次由北向南排列(大门在最南端,最先达到的第一辆车停放在车场的最北端),若车场…...

海康相 机
海康机器人-机器视觉-下载中心 海康威视MVS客户端及虚拟相机c开发案例-CSDN博客 相机驱动下载: 下载中心 VisionMaster 视频教程_哔哩哔哩_bilibili 【VisionMaster】试用版安装说明_visionmaster试用版-CSDN博客 海康视觉算法平台VisionMaster 4.3.0 C# 二次…...

用map实现el-table全选
<el-button size"small" type"primary" click"searchProxy">查询</el-button><el-checkbox v-model"selectAll" change"changeSelectAll" >全选</el-checkbox><el-table:data"taskList&…...

【开源免费】基于SpringBoot+Vue.JS社区团购系统(JAVA毕业设计)
本文项目编号 T 024 ,文末自助获取源码 \color{red}{T024,文末自助获取源码} T024,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…...

Java进阶之路:构造方法
🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝 🥇博主昵称:小菜元 🍟博客主页…...

2025秋招八股文--网络原理篇
前言 1.本系列面试八股文的题目及答案均来自于网络平台的内容整理,对其进行了归类整理,在格式和内容上或许会存在一定错误,大家自行理解。内容涵盖部分若有侵权部分,请后台联系,及时删除。 2.本系列发布内容分为12篇…...

C#基础-面向对象的七大设计原则
目录 1.开放封闭原则(OCP) 2.单一职责原则(SRP) 3.依赖倒置原则(DIP) 4.里氏替换原则(LSP) 5.接口隔离原则(ISP) 6.合成复用原则(CRP&#…...

CSS 容器查询一探究竟
引言 在 《请列举四种「等比例自适应矩形」实现方案?》 一文中我曾使用到容器查询单位 cqw, 当时在使用 cqw 过程中只是简单过了一下容器查询相关的内容!! 所以这次专门出一篇文章, 对容器查询做一个梳理… 一、是什么 在实际开发中您是否遇到过需要根据父容器的…...

AI论文写作:如何轻松实现高原创度大揭秘
随着人工智能技术的迅猛进步,AI论文写作工具在学术界开始崭露头角,作为一种辅助手段。这些工具不仅能高效地生成论文的初步版本或部分章节,而且其产出的内容往往展现出高度的创新性。本文将探讨AI论文写作工具为何能产出如此高原创度的内容&a…...

AtCoder Beginner Contest 375 A-E 题解
我的老师让我先做最后再交,看正确率(即以OI赛制打abc) 所以我用的小号(… …) C 卡了老半天才出来,我把题读错了 难度: A. Seats 题意 给你一个字符串 S S S,仅包含 . 和 #&…...

其他-自己手动更换汽车电磁进排气阀0.9.2
其他-自己手动更换汽车电磁进排气阀0.9.0 背景本次工具流程注意参考 2024年10月18日08:57:00—0.9.2 背景 昨天手动更换了电磁阀,记录下过程和注意事项,简单总结了一下 本次工具 10号套筒和工具老虎钳锤子一字改刀新的进排气电磁阀 流程 打开引擎盖…...

生成模型初认识
生成模型初认识 参考学习资料:李宏毅-机器学习 以下为课程过程中的简易笔记 生成模型 为什么要用生成模型?——创造力:同一个输入,产生不同的输出(distribution),有一定概率发生某种随机事件…...

Java中的一些名词概念
**函数式接口:** 概念:一个接口中的抽象方法只有一个,那么这个接口就是一个函数式接口。形参: 形参变量是**功能函数里的变量**,只有<u>在被调用的时候才分配内存单元</u>,<u>调用结束后立即释放</u>。…...

沈阳乐晟睿浩科技有限公司:引领抖音小店迈向新纪元
在当今数字化浪潮汹涌的时代,电子商务以其独特的魅力和无限潜力,正深刻改变着人们的消费习惯与商业模式。在这场变革中,沈阳乐晟睿浩科技有限公司凭借其敏锐的市场洞察力和卓越的技术实力,成为了抖音小店领域的佼佼者,…...

[图形学]蒙特卡洛积分方法介绍及其方差计算
一、简介 本文介绍了蒙特卡洛积分算法的基本原理和其误差计算。 二、蒙特卡洛积分介绍 1. 介绍 蒙特卡洛积分算法是一种数值积分算法,用于对复杂函数进行积分。 例如,对于目标积分函数: ∫ a b f ( x ) d x (1) \int_{a}^{b}f(x)\rm{d}x…...

智慧社区Web解决方案:Spring Boot框架探索
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于web的智慧社区设计与实现的相关信息成…...

基于预测算法的航班离港延误系统
毕业设计不知道做什么?想找一个结合算法与应用的项目?那你绝对不能错过这个"基于预测算法的航班离港延误系统"!✈️📊 项目简介: 这个系统专注于航班离港的延误预测,通过强大的神经网络技术对大…...

【汇编语言】寄存器(内存访问)(七)—— CPU提供的栈机制
文章目录 前言1. CPU提供的栈机制2. push指令3. 问题4. 问题的分析与解答5. pop指令结语 前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深…...

webAPI中的节点操作、高级事件
一、节点操作 1.删除节点 node.removeChild(); 方法从node节点中删除一个子节点,返回删除的节点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…...

C++内存对齐机制简介
C内存对齐机制是指数据在内存中按照特定规则进行排列,这个机制可以提高访问效率并且满足硬件访问特性。 C内存对齐机制的一些关键规则如下: 不同类型的数据在内存中的起始地址应该是其大小的倍数。比如,4字节的整型应该存放在地址是4的倍数…...

java集合进阶篇-《List集合》
个人主页→VON 收录专栏→java从入门到起飞 目录 编辑 一、前言 二、List集合简要概述 三、List集合主要函数的应用 四、List集合的遍历 五、思考 一、前言 List集合与Collection集合的相同之处还是挺多的,不过有些小细节又不太一样,其中有一个…...

FPGA图像处理之均值滤波
文章目录 一、什么是图像滤波?1.1 噪声类型1.2 滤波类型 二、均值滤波原理2.1 3*3窗口滑动过程2.2 图像扩展 三、Matlab实现均值滤波四、FPGA实现均值滤波4.1 生成 3*3 矩阵4.2 仿真3*3矩阵4.3 计算均值4.4 仿真均值滤波 一、什么是图像滤波? 图像滤波是…...

高等数学 6.2 定积分在几何学上的应用
文章目录 一、平面图形的面积1.直角坐标情形2.极坐标情形 二、体积1.旋转体体积2.平行截面面积为已知的立体的体积 三、平面曲线的弧长 一、平面图形的面积 1.直角坐标情形 我们已经知道,由曲线 y f ( x ) ( f ( x ) ⩾ 0 ) y f(x) (f(x) \geqslant 0) yf(x)(f…...

缓存常见问题:缓存穿透、雪崩、击穿及解决方案分析
1. 什么是缓存穿透,怎么解决? 缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时…...

C++:拷贝构造
拷贝构造函数是参数类型为本类的引用的构造函数,它也叫复制构造函数,它只有一个参数。当没有写拷贝构造函数时,会有一个默认的拷贝构造函数。 class AA { public:AA(AA& ra){}} 那么什么时候会调用此函数呢?有以下三种情况 …...

BGP(边界网关协议)
1、网络AS(自治系统) 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。 AS是指在一个实体管辖下的拥有…...

Spring 概念汇总
一、Spring中的依赖注入和依赖反转 依赖注入(Dependency Injection) 概念 依赖注入是一种设计模式,它允许在对象创建时将其依赖的对象传递给它,而不是让对象自己去创建或查找依赖对象。在Spring中,依赖注入是控制反转…...

快速在找到函数的实体的方法
当我们写了许多许多的函数,那我们怎么快速的找到他们呢 我们只需要按下ctrl,在点击函数名字就可以快速的找到我们想要的函数...

05 django管理系统 - 部门管理 - 修改部门
04我们已经实现了新增部门的功能,下面开始修改部门模块的实现。 按道理来说,应该是做成弹框样式的,通过ajax悄咪咪的发数据,然后更新前端数据,但是考虑到实际情况,先用页面跳转的方式实现,后面…...

C++初阶——入门
目录 1、C发展历史 2、C版本更新 3、C参考文档 4、C书籍推荐 5、C的程序 6、命名空间 6.1 namespace的作用 6.2 namespace的定义 6.3 namespace的使用 7、C输入&输出 8、缺省参数 9、函数重载 10、引用 10.1 引用的概念和定义 10.2 引用的特性 10.3 引用的使…...