来看这样一道题!
解题思路:
(1)队列
package com.Parking; //队列结构 import java.util.Iterator; public class Queueimplements Iterable { //记录首结点 private Node head; //记录最后一个结点 private Node last; //记录队列中元素的个数 private int N; private class Node{ public T item; public Node next; public Node(T item, Node next) { this.item = item; this.next = next; } } public Queue() { this.head = new Node(null,null); this.last=null; this.N=0; } //判断队列是否为空 public boolean isEmpty(){ return N==0; } //返回队列中元素的个数 public int size(){ return N; } //向队列中插入元素t public void enqueue(T t){ if (last==null){ //当前尾结点last为null last= new Node(t,null); head.next=last; }else { //当前尾结点last不为null Node oldLast = last; last = new Node(t, null); oldLast.next=last; } //元素个数+1 N++; } //从队列中拿出一个元素 public T dequeue(){ if (isEmpty()){ return null; } Node oldFirst= head.next; head.next=oldFirst.next; N--; //因为出队列其实是在删除元素,因此如果队列中的元素被删除完了,需要重置last=null; if (isEmpty()){ last=null; } return oldFirst.item; } @Override public Iterator iterator() { return new QIterator(); } private class QIterator implements Iterator{ private Node n; public QIterator(){ this.n=head; } @Override public boolean hasNext() { return n.next!=null; } @Override public Object next() { n = n.next; return n.item; } } }
(2)栈
package com.Parking; import java.util.Iterator; public class Stackimplements Iterable{ //存储元素的数组 private T[] eles; //记录当前栈中的元素个数 private int N; //构造方法 public Stack(int capacity){ //初始化数组 this.eles=(T[])new Object[capacity]; //初始化长度 this.N=0; } //将一个栈置为空 public void clear(){ this.N=0; } //判断当前栈是否为空 public boolean isEmpty(){ return N==0; } //获取栈的元素个数 public int size(){ return N; } //获取指定位置的元素 public T get(int i){ return eles[i]; } //判断当前栈是否已满 public boolean isFull(){ return N == eles.length; } //把t元素压入栈 public void push(T t){ if(N == eles.length){ System.out.println("栈已满"); } else eles[N++]=t; } //弹出栈顶元素 public T pop(){ //记录索引i处的值 T current = eles[N-1]; //元素个数-1 N--; return current; } //遍历栈 @Override public Iterator iterator() { return new SIterator(); } private class SIterator implements Iterator{ private int cusor; public SIterator(){ this.cusor = 0; } @Override public boolean hasNext() {//判断容器还有没有下一个元素 return cusor < N; } @Override public Object next() {//获取当前容器下一个元素 return eles[cusor++]; } } }
(3)封装一个Car类,存储车辆到达/离去的标识,汽车牌照号,以及到达/离去的时刻
package com.Parking;
public class Car {
private String AD;
private int nob;
private int time;
public Car(String AD, int nob, int time) {
this.AD = AD;
this.nob = nob;
this.time = time;
}
public String getAD() {
return AD;
}
public void setAD(String AD) {
this.AD = AD;
}
public int getNob() {
return nob;
}
public void setNob(int nob) {
this.nob = nob;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
(4)主程序
package com.Parking;
import java.util.Iterator;
import java.util.Scanner;
public class Car_Park {
public static void main(String[] args) {
Stack stack1 = new Stack<>(4); //栈1用于充当停车场,已指定容量为4
Stack stack2 = new Stack<>(3);//栈2用于保存出栈的元素顺序
Queue queue = new Queue<>();//队列用于存储排队的车辆
//为车库初始化,存放三辆车
Car array[] = {new Car("A",1001,1),new Car("A",1002,2),new Car("A",1003,3)};
//遍历二维数组存放车辆,初始化停车场
int stack1num = 1;
int queuenum = 1;
for (int i = 0; i < 3; i++) {
stack1.push(array[i]); //栈未满进行压栈操作
System.out.println(array[i].getNob() + "号车已停在第" + stack1num + "号停车位,停车时刻为"+array[i].getTime()+"时刻");
stack1num++;
}
System.out.println("停车场已为你初始化完毕!欢迎进入车库管理系统");
System.out.println("请输入操作对应的编号:");
System.out.println("-----1-----停车或从车库中开出一辆车");
System.out.println("-----2-----从候车便道开出一辆车");
System.out.println("-----3-----查看候车场车辆信息");
System.out.println("-----4-----退出车库管理系统");
while (true) {
Scanner s = new Scanner(System.in);
int temp = 0;
temp = s.nextInt();
switch (temp) {
case 1: // -----功能1-----停车或从车库中开出一辆车
System.out.println("请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)");
String AD=s.next();
int nob=s.nextInt();
int time=s.nextInt();
Car car=new Car(AD,nob,time);
switch (car.getAD()) {
case "A":
if (!stack1.isFull()) {
stack1.push(car); //栈未满进行压栈操作
System.out.println(car.getNob() + "号车已停在第" + (stack1num++) + "号停车位,停车时刻为"+car.getTime()+"时刻");
stack1num++;
}else { //栈已满将元素放入队列中排队
car.setTime(0);
queue.enqueue(car);
System.out.println("车库已停满!!!已将车辆停放时刻置为0,你已进入候车位");
System.out.println(car.getNob() + "号车正在第" + queuenum + "号候车位等候");
queuenum++;
}
break;
case "D":
// car.getNob()是汽车出栈的编号,现用栈里的编号与出栈编号比较 相同则出栈不相同则保存到栈2里
Car chuzhan = null; //记录弹出栈的元素
int firstTime = 0; //记录初始时间
int lastTime = car.getTime(); //记录结束时间
int tim = 0; //记录时间差
while (!stack1.isEmpty()) { //提取全部元素,符合要求的直接提取,不符合存入栈2
Car temp1 = stack1.pop();
if (!(temp1.getNob()==car.getNob())) {
stack2.push(temp1);
} else { //符合要求提取出来
chuzhan = temp1; //将弹出元素赋值变量chuzhan
tim=car.getTime()-chuzhan.getTime();
System.out.println(""+chuzhan.getNob()+"号车辆已出车库,你的车辆停放时长为"+tim+"时,请缴纳相关费用!");
}
}
//弹栈后,栈2和队列里面的元素进栈,栈2全进,队列进1
stack1num = 1;//车位重置
System.out.println("车库车位已重置!");
while (!stack2.isEmpty()) {
Car temp2 = stack2.pop();
stack1.push(temp2);
System.out.println(temp2.getNob() + "号车已停在第" + stack1num+ "号停车位");
stack1num++;
}
if(!queue.isEmpty()) {
Car temp3 = queue.dequeue();
queuenum--;
int ti=car.getTime();
temp3.setTime(ti);
stack1.push(temp3);
System.out.println(temp3.getNob() + "号车已停在第" + stack1num + "号停车位,停车时刻为"+ temp3.getTime()+"时刻");
stack1num++;
}
break;
}
break;
case 2: // -----功能2-----从候车便道开出一辆车
System.out.println("请输入你要开出候车位的车辆的编号!");
int nobb=s.nextInt();
Queue queueTemp = new Queue<>();
while (!queue.isEmpty()){
Car car1=queue.dequeue();
if(!(car1.getNob()==nobb)) {
queueTemp.enqueue(car1);
}
}
queuenum--;
while (!queueTemp.isEmpty()) {
Car car2 = queueTemp.dequeue();
queue.enqueue(car2);
}
System.out.println("车辆已成功从候车位开出!本次停留不收取任何费用");
break;
case 3: // -----功能3-----查看候车场车辆信息
int queuem=1;
Iterator it=queue.iterator();
if(queue.isEmpty()){
System.out.println("候车位为空!");
}else {
while (it.hasNext()){
Object obj=it.next();
Car car1=(Car) obj;
System.out.println(car1.getNob() + "号车正在第" + queuem + "号候车位等候");
queuem++;
}
}
break;
case 4: //-----4-----退出车库管理系统
System.out.println("成功退出车库管理系统,欢迎再次进入!!!");
return;
}
}
}
}
(5)运行结果
1001号车已停在第1号停车位,停车时刻为1时刻
1002号车已停在第2号停车位,停车时刻为2时刻
1003号车已停在第3号停车位,停车时刻为3时刻
停车场已为你初始化完毕!欢迎进入车库管理系统
请输入操作对应的编号:
-----1-----停车或从车库中开出一辆车
-----2-----从候车便道开出一辆车
-----3-----查看候车场车辆信息
-----4-----退出车库管理系统
1
请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)
A
1004
4
1004号车已停在第4号停车位,停车时刻为4时刻
1
请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)
A
1005
5
车库已停满!!!已将车辆停放时刻置为0,你已进入候车位
1005号车正在第1号候车位等候
1
请输入车辆信息: A到达/D离去,汽车牌照号,到达/离去的时刻(默认时刻为从小到大!)
D
1002
6
1002号车辆已出车库,你的车辆停放时长为4时,请缴纳相关费用!
车库车位已重置!
1001号车已停在第1号停车位
1003号车已停在第2号停车位
1004号车已停在第3号停车位
1005号车已停在第4号停车位,停车时刻为6时刻



