问题描述
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。classCar{publicintno;publicintarrive;publicintleave;publicCarlink;//队列的指针publicintchargeStart=-1;publicCar(){}publicCar(intnumber){this.no=number;this.arrive=0;this.leave=0;this.link=null;}//成员方法:得到指针publicCargetLink(){returnlink;}//成员方法:修改指针publicvoidsetLink(Carn){link=n;}//成员方法;得到车牌号publicintgetNum(){returnno;}publicCar(intno,inttimeIn,inttimeOut){this.no=no;this.arrive=timeIn;this.leave=timeOut;}publicCar(intno,inttimeIn){this(no,timeIn,-1);}publicStringtoString(){returnString.format("Car(%d)",no);}}classCarStopextendsArrayStack<Car>{publicCar[]carStark1;//停车场privateinttopIndex;privatestaticfinalintMAX_SIZE=50;publicCarStop(){this(MAX_SIZE);topIndex=-1;}publicCarStop(intinitialCapacity){carStark1=(Car[])newObject[initialCapacity];topIndex=-1;}//检查该车是否有在车场publicbooleancontains(Carcar){booleanfound=false;for(inti=0;i<topIndex;i++)if(car.equals(carStark1[i])){found=true;break;}returnfound;}//获得停车场中第i号车位的车牌号publicintgetNum(inti){returncarStark1[i-1].no;}publicbooleanisFull(){returntopIndex>carStark1.length;}privateintsize(){//TODO自动生成方法存根returncarStark1.length;}publicCarpop(){returnsuper.pop();}publicvoidpush(Carcar){topIndex++;if(topIndex>=carStark1.length){doubleArray();}carStark1[topIndex]=car;}}//队列publicclassCarTunnel{Carheader;Carcurrent;intsize;//构造方法:建立一个空表publicCarTunnel(){header=newCar();current=header;size=0;}publicvoidunshift(Carcar){car.setLink(header);}//把当前位置之后插入一个新结点publicvoidinsertcar(intvalue){Carnewcar=newCar(value);newcar.setLink(current.link);current.setLink(newcar);current=newcar;size+=1;System.out.println("*********************************************");System.out.println("您的车牌号:"+newcar.no);System.out.println("停车场已满,您现在在等待中,您的位置是"+size+"个位置");System.out.println("*********************************************");}publicintremove(Carcar){intre;inti;for(i=0;i<size;i++)if(current!=car&¤t.link!=null)getNext();re=i;returnre;}//删除当前位置结点后面的结点publicvoiddelete(){Carreplace;replace=current.link;if(replace==null)return;current.setLink(replace.link);replace=null;size-=1;}//删除第i个结点publicvoiddelete(inti){if(i>size||i<=0)return;locate(i-1);delete();}//由当前结点到下一个结点publicCargetNext(){if(current==null)returnnull;current=current.link;returncurrent;}//得到队列的左后一辆车publicCargetLast(){while(current.link!=null){getNext();}returncurrent;}//由车牌号找到车publicCarfind(intvalue){current=header;while(current.no!=value){if(current.link==null){System.out.println("找不到需要的数!!!!");current=header;break;}current=current.link;}returncurrent;}//取得第m位置的元素publicCarlocate(intm){if(m>size)returnnull;current=header;inti;for(i=m;i>0;i--){getNext();}returncurrent;}//取得第一个元素publicCargetHeader(){returnheader.link;}//队列里有多少车publicintgetLength(){returnsize;}//察看车位publicvoidprint(){current=header.getLink();while(current!=null){inti=1;System.out.print(i+"号车位:"+current.getNum());System.out.println("");i++;getNext();}}}publicclassTest{CarStopcarStop=newCarStop();privateCarTunneltunnel=newCarTunnel();publicvoidtest(){//存放车辆信息,因为不是顺序输入的,所以放到Map中HashMap<Integer,Car>carMap=newHashMap<Integer,Car>();//最早进入车库的时间和最晚出车库的时间intstartTime,endTime;startTime=Integer.MAX_VALUE;endTime=Integer.MIN_VALUE;Scannerscanner=newScanner(System.in);//("A"或者"D"或者"E",int,int)while(scanner.hasNext("\((A|D|E),(\d+),(\d+)\)")){scanner.next("\((A|D|E),(\d+),(\d+)\)");MatchResultr=scanner.match();Carcar;//如果输入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=newCar(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;//出库时间和到达时间同样处理}elseif(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=newCar(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;}elseif(r.group(1).equalsIgnoreCase("E")){break;}}//把记录过的车做成数组并且排序Car[]cars=newCar[carMap.size()];cars=carMap.values().toArray(cars);Arrays.sort(cars,newComparator<Car>(){//排序顺序是到达时间>出库时间>车牌publicintcompare(Carc1,Carc2){if(c1.arrive!=c2.arrive)returnc1.arrive-c2.arrive;if(c1.leave!=c2.leave)returnc1.leave-c2.leave;returnc1.no-c2.no;}});for(inttime=startTime;time<=endTime;time++){System.out.println("TIME:"+time);for(intk=0;k<cars.length;k++){Carcar=cars[k];//如果有车在没有进入停车场的时候就已经到了出库时间if(car.leave==time&&carStop.isFull()&&!carStop.contains(car)){for(inti=tunnel.size;i>0;i--)//-1{Carc=tunnel.locate(i);if(c.no==car.no){for(intj=i+1;j<=tunnel.size;j++){c=tunnel.locate(j);System.out.println(c+"为"+car+"让路,重新进入等待区");}tunnel.delete(tunnel.remove(car));System.out.println(car+"没进入过停车场就离开了");}else{System.out.println(c+"为"+car+"让路");}}}else{//如果有车子现在到达if(car.arrive==time){//停车场不满if(!carStop.isFull()){//进入停车场carStop.push(car);//开始计费car.chargeStart=time;System.out.println(car+"进入停车场并且开始计费");}else{//停车场满,等待System.out.println(car+"到达,在等待区等待");tunnel.insertcar(car.no);}}}}//dealwithcarsinstop//thecasecarsleaveatsametimeisnotincluded//按照后进先出的顺序看有没有车要离开for(intk=carStop.carStark1.length-1;k>=0;k--){Carcar=carStop.carStark1[k];//准备离开if(car.leave==time){CarotherCar;//所有在他后面进来的车准备让路while((otherCar=carStop.pop())!=car){//进入等待区的最前面tunnel.unshift(otherCar);System.out.println(otherCar+"准备为"+car+"让路");}for(intm=tunnel.size;m>0;m--){System.out.println(tunnel.locate(m)+"为"+car+"让路");}System.out.println(otherCar+"离开,停车时间:"+(otherCar.leave-otherCar.chargeStart));for(intm=1;m<=tunnel.size;m++){System.out.println(tunnel.locate(m)+"让路完毕,重新进入等待区");}CarwaitingCar;//停车场有空位,等待序列最前面的车入库while(!carStop.isFull()&&(waitingCar=tunnel.getHeader())!=null){carStop.push(car);//停车计时开始if(waitingCar.chargeStart==-1){System.out.println(waitingCar+"停车计时时间改为:"+time);waitingCar.chargeStart=time;}System.out.println(waitingCar+"进入停车场");}}}}}publicstaticvoidmain(String[]args){newTest().test();}}
解决方案
解决方案二:
该回复于2011-01-06 13:07:10被版主删除
解决方案三:
内容这么长
解决方案四:
你直接发错误就行,看错误比看代码强
解决方案五:
在它之后进入的车辆必须先退出车场为它让路,这句话不是很理解。。。难道别人停好车了还要开出来?
解决方案六:
引用3楼dyllove98的回复:
你直接发错误就行,看错误比看代码强
O(∩_∩)O哈!
解决方案七:
出了什么错误呢?要告诉大家才行
解决方案八:
同意楼上的