数据结构--栈和队列--停车场问题

这篇具有很好参考价值的文章主要介绍了数据结构--栈和队列--停车场问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、问题描述

二、实验目的

三、需求分析

四、方法描述

五、代码实现

六、实验结果测试


一、问题描述

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

二、实验目的

熟悉栈和队列的基本特性,掌握栈和队列基本运算的实现过程。

三、需求分析

问题理解:该问题结合了栈和队列。停车场进出车相当于栈,先进后出。便道上的车,要排队,相当于队列,先进先出

其中本题要考虑进车、出车、缴费三个模块问题

进车:停车场是否停满了,若停满了则在便道等候

出车:找到要出去的车,是在停车场还是便道。停车场则如栈的方式出去,便道为队列。同时其他车辆更新其时间

缴费:计算其停车时间经行计算。

解决问题的策略:

该程序使用一个栈来表示停车场,使用一个链式队列来表示等待区。程序还有一个临时停车区,使用另一个栈来表示。当一辆车进入停车场时,程序会检查停车场是否有空位。如果有空位,车辆将被停放在停车场中。如果没有空位,车辆将被添加到等待区。

当一辆车离开停车场时,程序首先检查车辆是否在停车场或等待区中。如果车辆在停车场中,程序会计算应付的金额并将车辆从停车场中移除。如果车辆在等待区中,程序会将车辆从等待区中移除并将其添加到临时停车区中。

在所有车辆离开停车场后,程序输出仍然停留在临时停车区和等待区的车的车牌号。

四、方法描述

本题定义5个结构体:车辆信息、停车场顺序存储栈、车辆的信息和便道链队中的节点、便道链队、缓存车道。 抽象出基本操作描述:定义10个自定义函数。

首先,程序通过输入获取停车场的最大容量和停车费用。

接着,程序初始化了停车场(carpark)、便道链队(linkWait)和临时区(dengdai)。

然后,程序通过循环不断接收输入,每次输入包括车辆的进出状态、车牌号和时间。当输入的进出状态、车牌号和时间都为0时,循环结束。

对于每次输入,程序根据车辆的进出状态进行处理:

如果是进场,检查停车场是否有空位,有空位则将车辆入场,否则将车辆放到便道上。

如果是出场,程序会根据车辆的状态在停车场和便道上进行查找和移动操作,以计算费用和安排车辆出场。

五、代码实现

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
int max;
typedef struct//车辆信息 
{
	int inOut;
	int carNumber;
	int time;
	int inpark;//车辆是否在停车场中 1:在停车场中;0:在便道中 
}cardata;

typedef struct//停车场顺序存储栈 
{
	cardata *top;
	cardata *base;
	int stacksize;
}carpark;


typedef struct waitcar//便道链队 
{
	cardata base;
	struct waitcar *next;
}waitcar,*waitcarPtr;

typedef struct//便道链队
{
	waitcarPtr front;
	waitcarPtr rear;
}linkWait;

typedef struct
{
	cardata *top;
	cardata *base;
	int stacksize;
}dengdai;


void Initdengdai(int max,dengdai& d)//新建临时停放区 
{
	d.base=(cardata *)malloc(max*sizeof(cardata));
	if(!d.base) return;
	d.stacksize=1;
	d.top=d.base;
}

void dengdaipush(dengdai& d,cardata* &data)//临时停放区进车 
{
	*d.top=*data;
	d.top++;
	d.stacksize++;
}

void dengdaipop(dengdai& d,cardata* &data)//临时停放区出车
{
	if(d.top==d.base) return;
	d.top--;
	data=d.top;
	d.stacksize--;
}


void InitPark(int m,carpark& c)//新建停车场 
{
	c.base=(cardata *)malloc(m*sizeof(cardata));
	if(!c.base) return;
	c.stacksize=0;
	c.top=c.base;
}

void parkpush(carpark& c,cardata data)//停车场进车 
{
	if(c.top-c.base>=max) return;
	if(!c.base) return;
	*c.top=data;
	c.top++;
	c.stacksize++;
}

void parkpop(carpark& c,cardata* &data)//停车场出车
{
	if(c.top==c.base) return;
	c.top--;
	data=c.top;
	c.stacksize--;
}

void searchPark(carpark& c,cardata* &data)//查找停车场栈顶 
{
	if(c.top==c.base) return;
	data=(c.top-1);
}

void Initwait(linkWait& l)//新建便道
{
	l.front=l.rear=(waitcarPtr)malloc(sizeof(waitcar));
	if(!l.front) return;
	l.front->next=NULL;
}

void Enwait(linkWait& l,cardata data)//进入便道 
{
	waitcarPtr p;
	p=(waitcarPtr)malloc(sizeof(waitcar));
	if(!p) return;
	p->base=data;
	p->next=NULL;
	l.rear->next=p;
	l.rear=p;
	if(l.front->next == NULL){
		l.front->next = l.rear;
	}
}

void Dewait(linkWait& l,cardata* &data)//出便道 
{
	waitcarPtr p;
	if(l.front==l.rear) return;
	p=l.front->next;
	*data=p->base;
	l.front->next=p->next;
	if(l.rear==p) l.rear=l.front;
	free(p);
}

int main()
{
	int parkCarNum=0;
	int i,res=0;
	double price,P;
	scanf("%d %lf",&max,&price);
	carpark c;
	linkWait l;
	dengdai d;
	waitcarPtr test;
	InitPark(max,c);
	Initwait(l);
	Initdengdai(max,d);
	cardata data,*DATA;//DATA为测试数据 
	while(1)
	{
		scanf("%d %d %d",&data.inOut,&data.carNumber,&data.time);
		if(data.inOut==0&&data.carNumber==0&&data.time==0) break;
		if(data.inOut==0)//入场 
		{
			if(c.stacksize<max)
			{
				data.inpark=1;
				parkpush(c,data);
			}
			else
			{
				data.inpark=0;
				Enwait(l,data);
			}
		}
		else//出场
		/* 1.找该车是在停车场还是便道 
		2.若在停车场让后面的车去临时区,
		搜索到出车的信息并计算费用 ,
		把临时区的车放回停车场,让便道的第一辆车进停车场并更改time
		3.若在便道上让前面的车到临时区,
		删掉离开的车的那个节点,
		把临时区的车接到链表的末尾  
		
		(每次要清理干净等待区)
		*/
		{
			data.inpark=1;
			res=0;
			if(data.inpark==1)
			{
				while(c.stacksize>0)
				{
					parkpop(c,DATA);
					if(DATA->carNumber==data.carNumber)
					{
						P=(data.time-DATA->time)*price;
						printf("%d %.2lf\n",data.carNumber,P);
						res=1;
						break;
					}
					dengdaipush(d,DATA);
				}
				while(d.top!=d.base)
				{
					dengdaipop(d,DATA);
					parkpush(c,*DATA);
				}
				if(res==1&&l.front!=l.rear)
				{
					Dewait(l,DATA);
					DATA->inpark=1;
					DATA->time=data.time;
					parkpush(c,*DATA);
					
				}
			} 
		    if(res==0)
			{
				DATA=&(l.front->next->base);
				while(DATA->carNumber!=data.carNumber)
				{
					Enwait(l,*DATA);
					Dewait(l,DATA);
				}
			}
		}
	}
	
	while(c.stacksize>0)
	{
		parkpop(c,DATA);
		dengdaipush(d,DATA);
	}
	while(d.top!=d.base)
	{
		dengdaipop(d,DATA);
		printf("%d ",DATA->carNumber);
		parkpush(c,*DATA);
	}
	putchar('\n');
	test=l.front->next;
	while(l.rear!=test)
	{
		DATA=&(test->base);
		printf("%d ",DATA->carNumber);
		test=test->next;
	}
	return 0;
}

六、实验结果测试

数据结构--栈和队列--停车场问题,大二,数据结构,c++,链表,学习文章来源地址https://www.toymoban.com/news/detail-836856.html

到了这里,关于数据结构--栈和队列--停车场问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 停车场管理系统(C语言顺序栈+链栈+链队列)

    1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈、队列进行分析; 2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用函数的形式来实现; 3.通过对参考代码的运行与调试,并且对以核心功能

    2024年02月08日
    浏览(43)
  • 基于 RFID 的停车场管理及数据接入

    电子不停车收费( ETC )是有源 RFID 车联网卡在武汉的应用。系统的工作原理是利用微波技 术、电子技术、计算机技术、通信和网络技术、传感技术、图像识别技术等高新技术的设备和软 件所组成的一个先进系统。 其技术主要采用车辆自动识别( AVI )技术,通过车道上方的

    2024年02月08日
    浏览(79)
  • 基于Echarts构建停车场数据可视化大屏(文末送书)

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 1.项目背景 2.项目简介 3.项目流程 3.1整体布局 3.2左边布局 3.3中间布局  3.4右边布局  

    2024年02月08日
    浏览(90)
  • 【python】python智能停车场数据分析(代码+数据集)【独一无二】

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 实现智能停车场数据分析,使用pygame实现

    2024年02月11日
    浏览(52)
  • 停车场收费管理系统/停车场管理系统的设计与实现

    摘  要 ABSTRACT 目   录 第 1 章 绪论 1.1背景及意义 1.2 国内外研究概况 1.3 研究的内容 第2章 相关技术 2.1 JSP技术介绍 2.2 SSM三大框架 2.3 MyEclipse开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 第3章 系统分析 3.1 需求分析 3.2 系统可行性分析 3.2.1技术可行性:技术背景 3.2.2经济可行性

    2024年02月12日
    浏览(53)
  • 共享停车位小程序,微信小程序停车场车位,微信小程序停车场系统毕设作品

      目的 :首先,在社会上“停车难”是一个众所周知的问题,每个小区,每个大厦都有自己的停车场,但是在没有进入停车场之前,我们没办法知道是否有空车位,空车位在哪个地方。为了解决这个问题我们打算做一个停车场车位预约小程序,来解决车主在进入停车场之前了

    2024年02月08日
    浏览(71)
  • 停车场收费系统

        1.1 AppServe集成应用     Mysql:MySQL 是一款安全、跨平台、高效的,并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持,由 MySQL 的初始开发人员 David Axmark 和 Michael Monty Widenius 于 1995 年建立的。     Php:PHP是

    2024年02月03日
    浏览(87)
  • 停车场管理系统

    开发   以下为停车场管理系统的代码:   首先定义Car类,记录车辆信息:   ```java public class Car {     private String plateNumber;  // 车牌号     private long enterTime;  // 进入停车场时间     private long exitTime;  // 离开停车场时间       public Car(String plateNumber, long enterTime) {      

    2024年02月09日
    浏览(41)
  • 停车场管理系统(C++)

    大二写的肯定会有很多很多很多缺点~希望大佬们能指出~给大家提供一个可以改的一个小东西,改成其他的什么什么也是可以的~有bug在评论区里说一下~952行~基本重要的都有注释~ 本“项目”实现了: 1.大中小车型分类 2.进场候车道 3.时间的自动提取 4.车牌的判定 5.查询、进车

    2024年01月16日
    浏览(51)
  • C#停车场管理系统

    现如今随着经济的发展, 私家车越来越多, 系统管理停车场变得尤为重要。所以我写了这个系统用来系统化的管理停车场的车辆的停入、驶出和计费,停车位的使用情况,停车证件的信息管理以及工作员工的信息管理,使得停车场的管理可以变的更加的方便快捷和人性化。

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包