美文网首页
停车场问题

停车场问题

作者: 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