最佳回答
推荐于:2021-02-13 19:32
import java.util.Arrays;import java.util.Comparator;import java.util.HashMap;import java.util.Scanner;import java.util.Stack;import java.util.Vector;import java.util.regex.MatchResult;public class Test {private CarStop carStop = new CarStop(3);private CarTunnel tunnel = new CarTunnel();public void test(){//存放车辆信息,因为不是顺序输入的,所以放到Map中HashMap carMap = new HashMap();//最早进入车库的时间和最晚出车库的时间int startTime, endTime;startTime = Integer.MAX_VALUE;endTime = Integer.MIN_VALUE;Scanner scanner = new Scanner(System.in);//("A"或者"D"或者"E", int, int)while(scanner.hasNext("\((A|D|E),(\d+),(\d+)\)")){scanner.next("\((A|D|E),(\d+),(\d+)\)");MatchResult r = scanner.match();Car car;//如果输入Aif (r.group(1).equalsIgnoreCase("A")){// 该车已经记录过if (carMap.keySet().contains(Integer.parseInt(r.group(2)))){// 取出来设置到达时间car = carMap.get(Integer.parseInt(r.group(2)));car.arrive = Integer.parseInt(r.group(3));}else{// 否则就记录该车car = new Car(Integer.parseInt(r.group(2)), Integer.parseInt(r.group(3)));carMap.put(car.no, car);}if (car.arrive < startTime) startTime = car.arrive;if (car.leave > endTime) endTime = car.leave;// 出库时间和到达时间同样处理}else if (r.group(1).equalsIgnoreCase("D")){if (carMap.keySet().contains(Integer.parseInt(r.group(2)))){car = carMap.get(Integer.parseInt(r.group(2)));car.leave = Integer.parseInt(r.group(3));}else{car = new Car(Integer.parseInt(r.group(2)), 0, Integer.parseInt(r.group(3)));carMap.put(car.no, car);}if (car.arrive < startTime) startTime = car.arrive;if (car.leave > endTime) endTime = car.leave;}else if (r.group(1).equalsIgnoreCase("E")){break;}}// 把记录过的车做成数组并且排序Car[] cars = new Car[carMap.size()];cars = carMap.values().toArray(cars);Arrays.sort(cars, new Comparator(){// 排序顺序是到达时间>出库时间>车牌public int compare(Car c1, Car c2) {if (c1.arrive!=c2.arrive) return c1.arrive - c2.arrive;if (c1.leave!=c2.leave) return c1.leave - c2.leave;return c1.no - c2.no;}});for (int time=startTime; time<=endTime; time++){System.out.println("TIME:" + time);for (int k=0;k=0;i--){Car c = tunnel.get(i);if (c.equals(car)){for (int j=i+1;j=0; k--){Car car = carStop.elementAt(k);//准备离开if (car.leave == time){Car otherCar;// 所有在他后面进来的车准备让路while ((otherCar = carStop.pop())!=car){// 进入等待区的最前面tunnel.unshift(otherCar);System.out.println(otherCar + "准备为" + car + "让路");}for (int m=tunnel.size()-1;m>=0;m--){System.out.println(tunnel.elementAt(m) + "为" + car + "让路");}System.out.println(otherCar + "离开,停车时间:" + (otherCar.leave - otherCar.chargeStart));for (int m=0; m{public CarTunnel(){super();}public Car shift(){if (size() == 0) return null;return remove(0);}public void unshift(Car car){super.add(0, car);}public void push(Car car){super.add(car);}public Car pop(){if (size() == 0) return null;return remove(size()-1);}}@SuppressWarnings("serial")class CarStop extends Stack{private int size;public CarStop(int size){this.size = size;}public boolean isFull(){return size() == size;}public Car pop(){return super.pop();}public Car push(Car car){if (size() <= size){return super.push(car);}else{return null;}}}class Car{public int no;public int arrive;public int leave;public int chargeStart = -1;public Car(int no, int timeIn, int timeOut){this.no = no;this.arrive = timeIn;this.leave = timeOut;}public Car(int no, int timeIn){this(no, timeIn, -1);}public String toString(){return String.format("Car(%d)", no);}}结果:(A,6,31)(A,5,30)(A,4,20)(A,3,16)(A,2,15)(A,1,10)(D,1,50)(D,2,30)(D,3,31)(D,4,25)(D,5,32)(D,6,40)(E,0,0)TIME:10Car(1)进入停车场并且开始计费TIME:11TIME:12TIME:13TIME:14TIME:15Car(2)进入停车场并且开始计费TIME:16Car(3)进入停车场并且开始计费TIME:17TIME:18TIME:19TIME:20Car(4)到达,在等待区等待TIME:21TIME:22TIME:23TIME:24TIME:25Car(4)没进入过停车场就离开了TIME:26TIME:27TIME:28TIME:29TIME:30Car(5)到达,在等待区等待Car(3)准备为Car(2)让路Car(5)为Car(2)让路Car(3)为Car(2)让路Car(2)离开,停车时间:15Car(3)让路完毕,重新进入等待区Car(5)让路完毕,重新进入等待区Car(3)进入停车场Car(5)停车计时时间改为:30Car(5)进入停车场TIME:31Car(6)到达,在等待区等待Car(5)准备为Car(3)让路Car(6)为Car(3)让路Car(5)为Car(3)让路Car(3)离开,停车时间:15Car(5)让路完毕,重新进入等待区Car(6)让路完毕,重新进入等待区Car(5)进入停车场Car(6)停车计时时间改为:31Car(6)进入停车场TIME:32Car(6)准备为Car(5)让路Car(6)为Car(5)让路Car(5)离开,停车时间:2Car(6)让路完毕,重新进入等待区Car(6)进入停车场TIME:33TIME:34TIME:35TIME:36TIME:37TIME:38TIME:39TIME:40Car(6)离开,停车时间:9TIME:41TIME:42TIME:43TIME:44TIME:45TIME:46TIME:47TIME:48TIME:49TIME:50Car(1)离开,停车时间:40