java版停车系统(纯数据结构,无数据库)

**

java版停车场管理系统

**
项目要求:需要使用栈和队列两种数据结构。其中栈用于停车场和中转区,队列用于便道,对应的类名分别为:CarStack和CarQueue。CarStack为顺序栈,CarQueue为链队列,队列中的结点为CarNode类。Car类为车辆信息类,记录了车辆的车牌,到达时间和离开时间等信息。
这个系统,为了方便测试,写了一个随机随机四辆车进入系统[因为停车场只能停3辆车]

  1. 实现CarStack
public class CarStack<T> {
	//链表实现栈的操作
	//创建top节点
	CarNode<T> top;

	int count=0;
	//进栈
	public void push(T data) {
		CarNode<T> carNode =new CarNode<>(data);
		if (top != null) {
			carNode.next = top;
		}
		top= carNode;
		count++;
	}

	//判断是否为空栈
	public boolean isEmpty() {
		return top==null;
	}

	//看栈顶
	public T getTop() {
		if (!isEmpty()) {
			return top.data;
		}
		return null;
	}

	//取栈顶
	public T pop() {
		if (isEmpty()) {
			throw new RuntimeException("此栈为空!");
		}
		T data= top.data;
		top=top.next;
		count--;
		return data;
	}

	//判满
	public boolean isFull(){
		//  最大容量为3辆,便于观察
		int MAXSIZE = 3;
		return count == MAXSIZE;
	}

	public int getCount(){
		return count;
	}
}
  1. 实现CarQueue
public class CarQueue<T> {

    public CarNode<T> head=new CarNode<>();
    public CarNode<T> tail=head;
    public int size=0;

    /**
     * 链尾入队
     * @param data
     */
    public void enQueue(T data){
        CarNode<T> newNode = new CarNode<>(data);
        tail.setNext(newNode);
        tail=newNode;
        size++;
    }

    /**
     * 链头出队
     * @return
     */
    public T outQueue(){
        if (size!=0){
            CarNode<T> outQueueNode = head.getNext();
            T data=outQueueNode.getData();
            head.setNext(outQueueNode.getNext());
            size--;
            if (size==0){
                tail=head;
            }
            return data;
        }
        else {
            return null;
        }
    }

    public boolean isEmpty(){
        return size==0;
    }

    //遍历队列并输出
    public<T> void Cir(){
        CarNode<T> p= (CarNode<T>) head.next;
        while (p!=null){
            System.out.print(p.data+",");
            p=p.next;
        }
    }

}
  1. CarNode(实现上述两个数据结构所需要的节点)
public class CarNode<T>{
    public T data;
    public CarNode<T> next = null;

    public CarNode(T data) {
        this.data = data;
    }

    public CarNode() {
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public CarNode<T> getNext() {
        return next;
    }

    public void setNext(CarNode<T> next) {
        this.next = next;
    }
}
  1. 实现Car类(车辆的属性)
//汽车类
public class Car<T> extends CarNode {

	public String carNo; // 车牌号
	public String arrive; // 到达
	public String leave; // 离开
	public long arriveTime;	//到达时间
	public long leaveTime;	//离开时间

	//停车进来
	public Car(long arriveTime,String carNo)
	{
		this.arriveTime=arriveTime;
		arrive= timeUtils.getTimeStamp(arriveTime);	//通过时间戳获取时间
		this.carNo=carNo;
	}

	public int getTime(){
		return (int)(leaveTime-arriveTime)/60000;
	}

	public void setLeaveTime(long leaveTime){
		this.leaveTime=leaveTime;
		leave= timeUtils.getTimeStamp(leaveTime);
	}

	public String getCarNo() {
		return carNo;
	}

	public String getArrive() {
		return arrive;
	}

	public String getLeave() {
		return leave;
	}

	@Override
	public String toString() {
		return "Car{" +
				"carNo='" + carNo + '\'' +
				", arrive='" + arrive + '\'' +
				", leave='" + leave + '\'' +
				'}';
	}


}
  1. 计时器(用来计费)
public class timeUtils {
    /**
     * date转String
     * @param time 日期对象
     * @return String日期
     */

    public static String getTimeStamp(long time){   //时间戳
        Date date = new Date(time);
        return getDateString(date);
    }

    public static String getDateString(Date date) { //格式化
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

}
  1. 输入车辆的方法
public class inputCar {
    //获取车辆信息的,返回一个带有到达时间,跟车牌参数的对象
    public static Car getCar(String carNo){
        return new Car(System.currentTimeMillis(),carNo);
    }
}

  1. 停车场的一些常用方法
public class CarPark<T> {

	int maxPark=3;	//最大停车为3
    CarQueue<T> sideWalk=new CarQueue<>();   //便道
    CarStack<T> transitArea=new CarStack<>();    //中转区
    CarStack<T> parking=new CarStack<>();    //停车场
    long price=20; //停车费


	/**
	 * 功能: 将carNo车牌的汽车驶离停车场,设定离开时间,同时便道汽车进入停车场
	 * 参数:
	 * 	carNo -- 车牌信息
	 * 返回值:离开汽车
	 */
	public Car<T> leave(String carNo) {
		// TODO Auto-generated method stub
		Car<T> leaveCar = null;	//用来指向我们想要离开的车辆
//		当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。
		while (!parking.isEmpty()){
			Car<T> topCar= (Car<T>) parking.pop();
			if (carNo.equals(topCar.getCarNo())){
				//判断是不是我们要离开的那辆车,是的话,就离开,不是就进去中转区
				topCar.setLeaveTime(System.currentTimeMillis());
				leaveCar=topCar;
			}else {
				//让离开停车场的车后面的车进入中转区
				transitArea.push((T) topCar);
			}
		}
		//把中转区的车停进去
		transitAreaToParking();
		parking.push(sideWalk.outQueue());   //把队列里面第一辆车停入
		showWaiting();
		System.out.println();
		return leaveCar;
	}

	// 显示所有在便道上等待信息
	public void showWaiting() {
		// TODO Auto-generated method stub
        if (sideWalk.isEmpty()) {
            System.out.println("The sidewalk is empty");
        }
        else {
			System.out.print("waiting:");
        	sideWalk.Cir();
		}
	}
	
	// 显示所有入库车辆信息
	public void showPark() {
		// TODO Auto-generated method stub
		if (parking.isEmpty()){
			System.out.println("Parking is empty");
		}
		while (!parking.isEmpty()){
			Car<T> topCar= (Car<T>) parking.pop();
			System.out.println("Parking:"+topCar);
			transitArea.push((T) topCar);
		}
		//把中转区的车停进去
		transitAreaToParking();
	}


	/**
	 * 功能: 将carNo车牌的汽车驶入,如果停车场有车位则进入停车场,设定入场时间,否则在便道等待进入
	 * 参数:
	 * 	carNo -- 车牌信息
	 * 返回值:
	 */
	public void arrival(String carNo) {
		// TODO Auto-generated method stub
		Car car = inputCar.getCar(carNo);    //获取车的信息
		if (parking.getCount() < maxPark) {    //如果停车场内没有满
			if (sideWalk.isEmpty()) {    //便道上没车在等候
				parking.push((T) car);    //就直接进入停车场
				System.out.println("车辆"+car.getCarNo()+"已到达");
			} else {    //如果便道上有车等候
				parking.push(sideWalk.outQueue());    //就把便道上等候的车停进去
				sideWalk.enQueue((T) car);    //然后把刚刚获取的车放入便道
			}
		}
		else {
			System.out.print("停车场满了,"+car.getCarNo()+"请在便道等候"+"\t");
			sideWalk.enQueue((T) car);    //如果停车场满了,就直接进入便道
		}
	}

	/**
	 * 功能:查找车辆是否存在
	 * @param carNo
	 */
	public void searchCar(String carNo) {
		int flagInParking = searchInParking(carNo);
		int flagInSidewalk = searchInSidewalk(carNo);
		if (flagInParking == 1) {
			System.out.println("车牌为" + carNo + "在停车场内");
		} else if (flagInSidewalk == 1) {
			System.out.println("车牌为" + carNo + "在便道内");
		} else {
			System.out.println("查无此车");
		}
	}

	//查找停车场
	public int searchInParking(String carNo){
		int flag=0;	//哨子,查到了就变为1
		while (!parking.isEmpty()){
			Car<T> topCar= (Car<T>) parking.pop();
			if (topCar.getCarNo().equals(carNo)){
				flag=1;
			}
			transitArea.push((T) topCar);	//把车辆一辆一辆拿出来,直到找到为止
		}
		//把中转区的车辆停进去
		transitAreaToParking();
		return flag;
	}

	//查找便道
	public int searchInSidewalk(String carNo){
		int flag=0;	//哨子
		CarQueue<T> searchQueue=new CarQueue<>();	//创建一个查询队列,类似中转区
		while (!sideWalk.isEmpty()){
			Car<T> topCar= (Car<T>) sideWalk.outQueue();
			if (topCar.getCarNo().equals(carNo)){	//找到车辆,哨子变为1
				flag=1;
			}
			searchQueue.enQueue((T) topCar);	//把车拿出来后放进查询队列
		}
//		把查询队列里的车放回去
		while (!searchQueue.isEmpty()){
			sideWalk.enQueue(searchQueue.outQueue());
		}
		return flag;
	}

	/**
	 * 功能: 根据车辆的出入时间,计算费用及停车时长
	 * 参数:
	 * 	car -- 车辆信息
	 * 返回值:停车费用
	 */
	public double charging(Car car) {
		return car.getTime()*price;
	}

	//把中转区的车辆停进去
	public void transitAreaToParking(){
		while (!transitArea.isEmpty())
		{
			parking.push(transitArea.pop());
		}
	}

}
  1. 测试类
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Scanner;

import tools.Car;
import tools.CarPark;

public class test {

// 操作菜单
    public static void menu() {
        System.out.println("\n    §※§※§※§※§※§ Welcom Into The Parking System.§※§※§※§※§※§\t\n");
        System.out.println("\t※◎※◎※◎※◎  1. 车辆到达登记.※◎※◎※◎※◎\t");
        System.out.println("\t※◎※◎※◎※◎  2. 车辆离开登记.※◎※◎※◎※◎\t");
        System.out.println("\t※◎※◎※◎※◎  3. 显示车辆信息.※◎※◎※◎※◎\t");
        System.out.println("\t※◎※◎※◎※◎  4. 查询车辆.※◎※◎※◎※◎\t");
        System.out.println("\t※◎※◎※◎※◎  5. 随机向停车场内停入三辆车,便道上也停一辆.※◎※◎※◎※◎\t");
        System.out.println("\t※◎※◎※◎※◎  6. 退出系统.※◎※◎※◎※◎\t");
        System.out.println("\n\t请选择:\t");
    }
    
    //随机出现4辆车
    public static String randomCarNo() {
    	int count=4;
    	Random ra=new Random();
    	int num = 0;
    	String carNoPre="粤";
    	char carNoChar = 0;
    	for(int i=0;i<26;i++) {
    		carNoChar=(char) (ra.nextInt(26)+65);
    	}
    	for(int i=0;i<=count;i++) {
    		num=ra.nextInt(99999)+10000;
    	}
    	String carNo=carNoPre+carNoChar+num;
		return carNo;
    }
    
    
//主函数
    public static void main(String[] args) throws InterruptedException {
        CarPark carPark = new CarPark();
        Scanner scanner = new Scanner(System.in);
        String carNo;
        while(true) {
            menu();
            int item = -1;
            while (true) {
                item = scanner.nextInt();
                if(item>0 && item <7)
                    break;
                System.out.println("\n 输入有误,请重新选择: 1~5: ");
            }
            switch(item) {
                case 1:
                    System.out.println("请输入车牌号:");
                    carNo = scanner.next();
                    if (carPark.searchInParking(carNo)!=1){
                        carPark.arrival(carNo);                       
                    }else {
                        System.out.println("车辆已存在");
                    }
                    break;
                case 2:
                    System.out.println("请输入车牌号:");
                    carNo = scanner.next();
                    if (carPark.searchInParking(carNo)==1){
                        Car car = carPark.leave(carNo);
                        long time = car.getTime();
                        DecimalFormat df = new DecimalFormat("#.00");
                        String fee = df.format(carPark.charging(car));
                        System.out.println("车辆"+carNo+"停车时长"+time+"分钟,共收费"+fee+"元。");
                    }
                    else {
                        System.out.println("停车场内没有车牌为" + carNo + "的车");
                    }
                    break;
                case 3:
                    carPark.showPark();
                    carPark.showWaiting();
                    break;
                case 4:
                    System.out.println("请输入车牌号:");
                    carNo = scanner.next();
                    carPark.searchCar(carNo);
                    break;
                case 5:
                	for(int i=0;i<=4;i++) {
                		if (carPark.searchInParking(randomCarNo())!=1){
                			carPark.arrival(randomCarNo());
                			Thread.sleep(1000);	//每隔1秒停入一辆车
                		}else {
                            System.out.println("车辆已存在");
                        }
                	}
                    break;
                case 6:
                	System.exit(0);
            }
        }
    }
}

写在最后:这个系统本来用c语言去写会方便一些,但java版的csdn上不常见.这个系统还是有一些不太完善的.有什么不懂的或者有什么建议,可以评论或私我询问.本人纯小白,欢迎各位大佬指正.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值