设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。若停车场内已经停满 n辆车,那么后来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管理的模拟程序。
import java.util.Scanner;
public class Park {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
parks p=new parks();
wait w=new wait();
int cost=10,conp=3;//每小时停车费cost元,停车场容量conp
int n,t,d;
String num,day,time,str="";
System.out.println("停车场管理系统");
System.out.println("A:停车");
System.out.println("D:离开");
System.out.println("P:显示停车场信息---P 0 0 0");
System.out.println("W:显示候车场信息---W 0 0 0");
System.out.println("E:退出系统");
System.out.println("输入(A/D/P/W/E),车牌号,日,时间(小时)");
while(!str.equals("E")) {
str=in.next().toUpperCase();
num=in.next();
day=in.next();
time=in.next();
n=Integer.parseInt(num);
t=Integer.parseInt(time);
d=Integer.parseInt(day);
if(d<0||t<0||t>23) {
System.out.println("错误!请重新输入!");
continue;
}
switch(str) {
case "A":if(conp>p.n) {
p.inpark(n,d,t);
}else{
w.inwait(n);
};break;
case "D":p.outpark(n,d,t,cost);
if(w.empty()==false) {
n=w.outwait().num;
System.out.println(n+" 进入停车场");
p.inpark(n,d,t);
}
break;
case "P":p.show();break;
case "W":w.show();break;
case "E":;break;
default:System.out.println("错误!请重新输入!");break;
}
}
System.out.println("感谢使用!");
}
}
class car{
int num,day,time1,time2;
car next;
public car(int num,int day,int time1) {
this.num=num;
this.day=day;
this.time1=time1;
time2=0;
next=null;
}
}
class parks{
int n=0;
car head,tp;
public parks() {
head=new car(0,0,0);
tp=new car(0,0,0);
}
public car findcar(int num) {
tp=head;
while(tp.next!=null) {
if(tp.next.num==num) {
return tp;
}
tp=tp.next;
}
return null;
}
public void inpark(int num,int day,int time){
if(findcar(num)==null) {
tp=new car(num,day,time);
tp.next=head.next;
head.next=tp;
n++;
System.out.println("停车成功");
}else {
System.out.println("该车已在停车场中");
}
}
public void outpark(int num,int day,int time2,int cost) {
if(findcar(num)!=null) {
tp=findcar(num);
if(day>=tp.next.day) {
System.out.println("停车费:"+cost*((day-tp.next.day)*24+time2-tp.next.time1)+"元");
tp.next=tp.next.next;
n--;
}else {
System.out.println("日期错误!");
}
}else {
System.out.println("该车不在停车场中");
}
}
public void show() {
System.out.println("停车场内车数量为:"+n);
System.out.println("从门口向里为:");
tp=head.next;
while(tp!=null) {
System.out.println("车牌号: "+tp.num+" 停入时间: "+tp.day+"日"+tp.time1+"点");
tp=tp.next;
}
}
}
class wait{//.........................候车场
int n;
car f,r,tw;
public wait() {
f=r=new car(0,0,0);
tw=new car(0,0,0);
}
public void inwait(int num) {
n++;
tw=new car(num,0,0);
r.next=tw;
r=tw;
System.out.println("该车进入候车场中");
}
public car outwait() {
n--;
tw=f.next;
f.next=f.next.next;
return tw;
}
public void show() {
System.out.println("候车场内车数量为:"+n);
System.out.println("从门口向外为:");
tw=f.next;
while(tw!=null) {
System.out.println("车牌号: "+tw.num);
tw=tw.next;
}
}
public boolean empty() {
if(f.next==null) {
return true;
}else {
return false;
}
}
}