压栈/弹栈最难懂的地方就是:
压栈方法:
public void push(Object obj){
if(index >= this.elements.length){
System.out.println("栈已满,压栈失败!");
}
index++;
this.elements[index] = obj;//这是老师写的,我理解的是,obj[index]赋值给this.elements[index],而不是obj,obj是一个数组,而不是数组中的元素.所以我写的是:this.elements[index] = obj[index];
System.out.println("数组中的第" + (index + 1) + "个元素已经压栈!");
}
至于弹栈,是这样的:
public void pop(){
if(index < 0){
System.out.println("栈已空,弹栈失败.");
}
System.out.println("数组中的第" + (index + 1) + "个元素已经弹栈!");
index--;//这是用老师的方法加上我个人理解,其实这个方法只是输出了弹栈,数组中的元素本身还在,所以我在弹栈之前,加了一条this.elements[index] = null;
}
酒店入住系统,主要是考虑一个二维数组和房间号之间的关系,比如101.102.103..110
201.202.203..210
301.302.303..310
一共三层,数组就要这样:Room[][] rooms = new Room[3][10];
而rooms[0][0],对应的其实就是101,第一个下标为0,指向的楼层是1,即i+1,第二个下标为0,指向的是房号是1,即j+1,那么数组的下标所指向的房号就是(i+1)*100+j+1.
还有个要注意的地方是:toString()和equals()都要重写.toString()把自己想要输出的房间信息简洁明了的表示出来.equals把自己想要比较的过程和结果写出来,因为源码是直接用"=="比较,很容易出现与自己实际认知不符的情况.
toString()方法:
public String toString(){
return "[" + this.getNo + this.getType + (this.getStatus ? "空闲" : "占用") + "]";
}
equals()方法,这里用的比较房间号一致就认为是同一个房间:
public boolean euqals(Object obj){
if(obj == null || !(obj instanceof Room)){return false;}
if(this == obj){return true;}
Room room = (Room)obj;
return this.no = room.getNo();
}
另外,在酒店入住时,输入房间号是207这样的,要倒推出它的二维数组下标,比如207是二楼7号,之前注意了楼层是二维数组第一个下标加1,房号是第二个下标加1,所以它的数组下标是:rooms[1][6].
这个小练习还不尽完善,比如说入住了的,在别的访客订房时会把先前入住的人赶出去,比如断电了就得全部重来,bug多多,主要也就是认识下二维数组.