题目
设停车场是一个可停放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元
网友评论