美文网首页
停车场问题

停车场问题

作者: fastcv | 来源:发表于2019-08-16 00:21 被阅读0次
题目

设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若车场内已停满n辆车,则后来的汽车需要在门外的便道上等候,当有车开走时,便道上的第一辆车即可进入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待车辆开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的长短交费。(在便道上停留的时间不收费)。

尝试编写程序,模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。从终端读入汽车到达或者离去的数据,每组数据包含三项:1、是到达还是离开;2、汽车牌照号码;3、达到离去的时刻。与每组输入信息相应的输出信息为:如果是达到的车辆,则输出其停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。(提示:需另设一个栈,临时停放为让路而从车场退出的车)。

分析

两个栈、一个队列、一个控制器

结点:汽车

public class Car {

    //0 到达   1离开
    int status;
    String carId;
    long startTime;
    long endTime;
    Car next;
}

停车场

public class PStack {

    Car[] pCar = new Car[100];
    int useSize = 0;

    public void put(Car car){
        long startTime = System.currentTimeMillis();
        car.startTime = startTime;
        car.status = 0;
        pCar[useSize++] = car;
        System.out.println("编号:" + car.carId + " 车辆开始停车 停车时间:" + startTime + " 停车位编号:" + useSize);
    }

    public Car pop(){
        Car car = pCar[useSize-1];
        useSize--;
        System.out.println("编号:" + car.carId + " 车辆退出停车场");
        return car;
    }

    public boolean isFull() {
        return useSize >= 100;
    }
}

临时停车场

public class TempPStack {

    Car[] pCar = new Car[100];
    int useSize = 0;

    public void put(Car car){
        pCar[useSize++] = car;
        System.out.println("编号:" + car.carId + " 车辆进入临时停车场  临时停车位编号:" + useSize);
    }

    public Car pop(){
        Car car = pCar[useSize-1];
        useSize--;
        System.out.println("编号:" + car.carId + " 车辆退出临时停车场");
        return car;
    }
}

便道

public class PQueue {

    Car frontCar;
    Car rearCar;

    public PQueue() {
        frontCar = new Car();
        frontCar.next = null;
        rearCar = frontCar;
    }

    public void join(Car car) {
        if (frontCar.next == null) {
            frontCar.next = car;
            rearCar = car;
        }else {
            rearCar.next = car;
            rearCar = car;
        }
        System.out.println("编号:" + car.carId + " 车辆开始排队等候停车 ");
    }

    public Car exit(){
        Car car = frontCar.next;
        frontCar.next = car.next;
        System.out.println("编号:" + car.carId + " 车辆排队结束 ");
        return car;
    }

    public boolean haveCar(){
        return frontCar.next!=null;
    }
}

入场控制器:

public class PController {

    private final PQueue queue;
    private final PStack pStack;
    private final TempPStack tempPStack;

    public PController() {
        queue = new PQueue();
        pStack = new PStack();
        tempPStack = new TempPStack();
    }

    public void enter(Car car) {
        if (!pStack.isFull()){
            /**
             * 停入车辆
             */
            pStack.put(car);
        }else{
            /**
             * 停车排队等候
             */
            queue.join(car);
        }
    }

    public Car exit(String carId) {
        Car exitCar = quit(carId);
        enterP();
        if (exitCar != null){
            queueEnterP();
            calMoney(exitCar);
        }
        return exitCar;
    }

    private void calMoney(Car exitCar) {
        long dMoney = (exitCar.endTime - exitCar.startTime)*2;
        System.out.println("编号"+exitCar.carId + "  收费:" + dMoney + "元");
    }

    private void queueEnterP() {
        /**
         * 检查是否有车在排队
         * 有的话让队列前面的车辆进入停车场
         */

        if (queue.haveCar()) {
            Car car = queue.exit();
            enter(car);
        }
    }

    private void enterP() {
        /**
         * 找到车辆退出后,将临时停车场的车辆依次停入停车场
         */
        int size = tempPStack.useSize;
        for (int i = 0; i < size; i++) {
            Car car = tempPStack.pop();
            pStack.put(car);
        }
    }

    private Car quit(String carId) {
        Car exitCar = null;
        //依次查找需要退出的车辆
        int size = pStack.useSize;
        for (int i = 0; i < size; i++) {
            Car car = pStack.pop();
            if (carId.equals(car.carId)){
                long endTime = System.currentTimeMillis();
                car.status = 1;
                car.endTime = endTime;
                exitCar = car;
                break;
            }else {
                /**
                 * 前面退出的车辆停入临时停车位
                 */
                tempPStack.put(car);
            }
        }
        return exitCar;
    }
}

测试

public class CarMain {

    public static void main(String[] args) {

        PController controller = new PController();

        for (int i = 0; i < 150; i++) {
            Car car = new Car();
            car.next = null;
            car.carId = "IDBB00" + i;
            controller.enter(car);

            if (i>5 && i%10 == 0){
                Car exit = controller.exit("IDBB00" + (i - 5));
                if (exit == null)
                    System.out.println("无车辆退出");
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

编号:IDBB000 车辆开始停车 停车时间:1565885882011 停车位编号:1
编号:IDBB001 车辆开始停车 停车时间:1565885882012 停车位编号:2
编号:IDBB002 车辆开始停车 停车时间:1565885882012 停车位编号:3
编号:IDBB003 车辆开始停车 停车时间:1565885882012 停车位编号:4
编号:IDBB004 车辆开始停车 停车时间:1565885882012 停车位编号:5
编号:IDBB005 车辆开始停车 停车时间:1565885882012 停车位编号:6
编号:IDBB006 车辆开始停车 停车时间:1565885882012 停车位编号:7
编号:IDBB007 车辆开始停车 停车时间:1565885882012 停车位编号:8
编号:IDBB008 车辆开始停车 停车时间:1565885882012 停车位编号:9
编号:IDBB009 车辆开始停车 停车时间:1565885882012 停车位编号:10
编号:IDBB0010 车辆开始停车 停车时间:1565885882012 停车位编号:11
编号:IDBB0010 车辆退出停车场
编号:IDBB0010 车辆进入临时停车场  临时停车位编号:1
编号:IDBB009 车辆退出停车场
编号:IDBB009 车辆进入临时停车场  临时停车位编号:2
编号:IDBB008 车辆退出停车场
编号:IDBB008 车辆进入临时停车场  临时停车位编号:3
编号:IDBB007 车辆退出停车场
编号:IDBB007 车辆进入临时停车场  临时停车位编号:4
编号:IDBB006 车辆退出停车场
编号:IDBB006 车辆进入临时停车场  临时停车位编号:5
编号:IDBB005 车辆退出停车场
编号:IDBB006 车辆退出临时停车场
编号:IDBB006 车辆开始停车 停车时间:1565885882012 停车位编号:6
编号:IDBB007 车辆退出临时停车场
编号:IDBB007 车辆开始停车 停车时间:1565885882012 停车位编号:7
编号:IDBB008 车辆退出临时停车场
编号:IDBB008 车辆开始停车 停车时间:1565885882012 停车位编号:8
编号:IDBB009 车辆退出临时停车场
编号:IDBB009 车辆开始停车 停车时间:1565885882012 停车位编号:9
编号:IDBB0010 车辆退出临时停车场
编号:IDBB0010 车辆开始停车 停车时间:1565885882013 停车位编号:10
编号IDBB005  收费:0元
编号:IDBB0011 车辆开始停车 停车时间:1565885882013 停车位编号:11
编号:IDBB0012 车辆开始停车 停车时间:1565885882013 停车位编号:12
编号:IDBB0013 车辆开始停车 停车时间:1565885882013 停车位编号:13
编号:IDBB0014 车辆开始停车 停车时间:1565885882013 停车位编号:14
编号:IDBB0015 车辆开始停车 停车时间:1565885882013 停车位编号:15
编号:IDBB0016 车辆开始停车 停车时间:1565885882013 停车位编号:16
编号:IDBB0017 车辆开始停车 停车时间:1565885882013 停车位编号:17
编号:IDBB0018 车辆开始停车 停车时间:1565885882013 停车位编号:18
编号:IDBB0019 车辆开始停车 停车时间:1565885882013 停车位编号:19
编号:IDBB0020 车辆开始停车 停车时间:1565885882013 停车位编号:20
编号:IDBB0020 车辆退出停车场
编号:IDBB0020 车辆进入临时停车场  临时停车位编号:1
编号:IDBB0019 车辆退出停车场
编号:IDBB0019 车辆进入临时停车场  临时停车位编号:2
编号:IDBB0018 车辆退出停车场
编号:IDBB0018 车辆进入临时停车场  临时停车位编号:3
编号:IDBB0017 车辆退出停车场
编号:IDBB0017 车辆进入临时停车场  临时停车位编号:4
编号:IDBB0016 车辆退出停车场
编号:IDBB0016 车辆进入临时停车场  临时停车位编号:5
编号:IDBB0015 车辆退出停车场
编号:IDBB0016 车辆退出临时停车场
编号:IDBB0016 车辆开始停车 停车时间:1565885882013 停车位编号:15
编号:IDBB0017 车辆退出临时停车场
编号:IDBB0017 车辆开始停车 停车时间:1565885882013 停车位编号:16
编号:IDBB0018 车辆退出临时停车场
编号:IDBB0018 车辆开始停车 停车时间:1565885882014 停车位编号:17
编号:IDBB0019 车辆退出临时停车场
编号:IDBB0019 车辆开始停车 停车时间:1565885882014 停车位编号:18
编号:IDBB0020 车辆退出临时停车场
编号:IDBB0020 车辆开始停车 停车时间:1565885882014 停车位编号:19
编号IDBB0015  收费:0元
编号:IDBB0021 车辆开始停车 停车时间:1565885882014 停车位编号:20
编号:IDBB0022 车辆开始停车 停车时间:1565885882014 停车位编号:21
编号:IDBB0023 车辆开始停车 停车时间:1565885882014 停车位编号:22
编号:IDBB0024 车辆开始停车 停车时间:1565885882014 停车位编号:23
编号:IDBB0025 车辆开始停车 停车时间:1565885882014 停车位编号:24
编号:IDBB0026 车辆开始停车 停车时间:1565885882014 停车位编号:25
编号:IDBB0027 车辆开始停车 停车时间:1565885882014 停车位编号:26
编号:IDBB0028 车辆开始停车 停车时间:1565885882014 停车位编号:27
编号:IDBB0029 车辆开始停车 停车时间:1565885882014 停车位编号:28
编号:IDBB0030 车辆开始停车 停车时间:1565885882014 停车位编号:29
编号:IDBB0030 车辆退出停车场
编号:IDBB0030 车辆进入临时停车场  临时停车位编号:1
编号:IDBB0029 车辆退出停车场
编号:IDBB0029 车辆进入临时停车场  临时停车位编号:2
编号:IDBB0028 车辆退出停车场
编号:IDBB0028 车辆进入临时停车场  临时停车位编号:3
编号:IDBB0027 车辆退出停车场
编号:IDBB0027 车辆进入临时停车场  临时停车位编号:4
编号:IDBB0026 车辆退出停车场
编号:IDBB0026 车辆进入临时停车场  临时停车位编号:5
编号:IDBB0025 车辆退出停车场
编号:IDBB0026 车辆退出临时停车场
编号:IDBB0026 车辆开始停车 停车时间:1565885882015 停车位编号:24
编号:IDBB0027 车辆退出临时停车场
编号:IDBB0027 车辆开始停车 停车时间:1565885882015 停车位编号:25
编号:IDBB0028 车辆退出临时停车场
编号:IDBB0028 车辆开始停车 停车时间:1565885882015 停车位编号:26
编号:IDBB0029 车辆退出临时停车场
编号:IDBB0029 车辆开始停车 停车时间:1565885882015 停车位编号:27
编号:IDBB0030 车辆退出临时停车场
编号:IDBB0030 车辆开始停车 停车时间:1565885882015 停车位编号:28
编号IDBB0025  收费:2元

相关文章

网友评论

      本文标题:停车场问题

      本文链接:https://www.haomeiwen.com/subject/kppojctx.html