数据结构——java栈+队列实现简单的停车场管理问题

文章目录

  • 源码地址:
    • 重要
    • 问题描述
    • 要求:
    • 问题分析
    • 代码实现:
      • ParkingLotManagementSystem.class
    • 测试:
      • 车辆停在停车场离开:
      • 车辆停在便道离开:

源码地址:

源码地址:https://gitee.com/zenghua3300/Data-Structures
喜欢的小伙伴麻烦帮点一个star


重要

本文设计和代码是基于 以下博客(请点击)

数据结构——栈的java实现(一)-使用顺序存储结构(数组)以及实现

数据结构——队列的java实现(三)-使用单向链表以及实现

以下是往期数据结构文章,虽然这项目中还未使用到

数据结构——栈的java实现(二)-使用单向链表以及实现

数据结构——队列的java实现(一)-使用顺序存储结构(数组)以及实现

数据结构——队列的java实现(二)-循环队列


问题描述

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

车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。

如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,

一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。

停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,

待其开出停车场后,这些车辆再依原来的次序进场。

每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。

如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。

编制程序模拟该停车场的管理。

要求:

若是到达的车辆,输出其在停车场中或者便道中的位置。

若离去的车辆是停车场内的车辆,则额输出其在停车场中停留的时间和应缴纳的费用,车牌号,还有其空出的车位号,最后选择便道最前面一辆车辆进入停车场停车。

若离去的车辆是便道中的车辆,则直接离去,不算费用,也不用输出车辆的位置。

问题分析

1.停车场中某车的离开必须在其前面的车已经离开之后才行,满足“先进后出”的特性,因此采用栈来模拟停车场。

2.对于指定停车场,其车位相对固定,因此采用顺序栈。

3.从停车场出来为后面的车让路的车也是先出的后进,因此也用栈来模拟。

4.从停车场出来的车数最大不超过停车场的车,因此采用长度等于车场车辆数的顺序栈。

5.便道上的车按照先到先开进车场的原则,满足“先进先出”的特性,因此可以用队列来模拟便道。

6.便道上的车辆数目不固定,因此采用链队列。

7.每组数据应包含:到达还是离去,车辆牌照号码,到达或离去的时刻。

用到了之前写的顺序栈和链队列

实现代码:有详细注释


代码实现:

ParkingLotManagementSystem.class


import java.util.Scanner;
import java.text.DecimalFormat;
import java.util.GregorianCalendar;
 

public class ParkingLotManagementSystem {
 
	private ArrayStack S = new ArrayStack(10);// 存放停车场上的车辆信息,假设停车场只有10个位置
	private LinkedListQueue Q = new LinkedListQueue();// 存放便道上的车辆信息
	private double fee = 2;// 每分钟停车费用
	public final static int DEPARTURE = 0;// 标识车辆离开
	public final static int ARRIVAL=1;//标识车辆到达
	
	//停车场管理,license表示车牌号,action表示车辆的动作,到达或离开
	public void parkingManage(String license,String action) throws Exception{
		if("arrive".equals(action)){//到达
			CarInfo info=new CarInfo();
			info.license=license;//记录车牌号
			if(S.getSize() < 10){//停车场未满
				info.arrTime=(GregorianCalendar)GregorianCalendar.getInstance();//当前时间初始化到达时间
				info.state=ARRIVAL;
				S.push(info);//进入停车场
				System.out.println(info.license+"停放在停车场第"+S.getSize()+"个位置!");
			}
			else {//停车场已满
				Q.enqueue(info);//进入便道
				System.out.println(info.license+"停放在便道第"+Q.getSize()+"个位置!");
			}
		}
		else if("depart".equals(action)){//车辆离开
			CarInfo info=null;
			int location=0;//用于记录车辆位置
			if(S.contains(license)){//离开的车辆在停车场中
				//构造一个新栈存储因车辆离开而导致的其他车辆暂时退出停车场
				ArrayStack S2=new ArrayStack(S.getSize());
				for(int i=S.getSize();i>0;i--){
					info=(CarInfo)S.pop();
					if(info.license.equals(license)){//如果排到了真要出去的车辆
						//当前时间初始化离开时间
						info.depTime=(GregorianCalendar)GregorianCalendar.getInstance();
						info.state=DEPARTURE;
						location=i;//把车牌号存入location
						break;
					}
					else
						S2.push(info);//其他车辆暂时退出车场
				}
				//如果S2中还有车辆,则全部将其重新进入车场S中
				while(!S2.isEmpty()){
					//其他车辆重新进入车场
					S.push(S2.pop());
				}
				if(location!=0){//停车场内存在指定车牌号的车辆
					//计算停放时间,并把毫秒换成分钟
					double time=(info.depTime.getTimeInMillis()-info.arrTime.getTimeInMillis())/(1000*60);
					DecimalFormat df=new DecimalFormat("0.0");//对double进行格式化保留两位小数
					System.out.println("车牌号为:"+info.license+",\n停放车位号:"+location+","+"\n共停放了:"+df.format(time)+"分钟,\n费用为:"+df.format(time*fee)+"元");
				}
				//当停车场的车辆离开后,从队列Q中选最前面的一辆车进入停车场,并开始计时
				if(!Q.isEmpty()){
					info=(CarInfo)Q.dequeue();
					info.arrTime=(GregorianCalendar)GregorianCalendar.getInstance();
					info.state=ARRIVAL;
					S.push(info);
					System.out.println(location+"号停车位有空位了,"+info.license+"从便道进入停车场"+location+"位置停车!");
				}
			}
			CarInfo carInfo = (CarInfo) Q.containsAndremove(license);
			if(carInfo != null){//离开的车辆在便道中
//				Q.dequeue(info);//进入便道
				System.out.println(carInfo.license+"停放在便道,现已离开");
			}
		}
	}
	
	public static void main(String[] args) throws Exception {
		ParkingLotManagementSystem plms=new ParkingLotManagementSystem();
		for(int i=1;i<=12;i++){
			plms.parkingManage("桂A0000"+String.valueOf(i), "arrive");
		}
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入车牌号");
		String license=sc.next();
		System.out.println("arrive or depart??");
		String action=sc.next();
		plms.parkingManage(license, action);
	}
 
}



测试:

车辆停在停车场离开:

桂A00001停放在停车场第1个位置!
桂A00002停放在停车场第2个位置!
桂A00003停放在停车场第3个位置!
桂A00004停放在停车场第4个位置!
桂A00005停放在停车场第5个位置!
桂A00006停放在停车场第6个位置!
桂A00007停放在停车场第7个位置!
桂A00008停放在停车场第8个位置!
桂A00009停放在停车场第9个位置!
桂A000010停放在停车场第10个位置!
桂A000011停放在便道第1个位置!
桂A000012停放在便道第2个位置!
请输入车牌号
桂A00004
arrive or depart??
depart
车牌号为:桂A00004,
停放车位号:4,
共停放了:6.0分钟,
费用为:12.04号停车位有空位了,桂A000011从便道进入停车场4位置停车!

车辆停在便道离开:

桂A00001停放在停车场第1个位置!
桂A00002停放在停车场第2个位置!
桂A00003停放在停车场第3个位置!
桂A00004停放在停车场第4个位置!
桂A00005停放在停车场第5个位置!
桂A00006停放在停车场第6个位置!
桂A00007停放在停车场第7个位置!
桂A00008停放在停车场第8个位置!
桂A00009停放在停车场第9个位置!
桂A000010停放在停车场第10个位置!
桂A000011停放在便道第1个位置!
桂A000012停放在便道第2个位置!
请输入车牌号
桂A000011
arrive or depart??
depart
桂A000011停放在便道,现已离开

你可能感兴趣的:(数据结构)