数组模拟栈
题目要求:
编写程序,使用一维数组,模拟栈数据结构。
1、这个栈可以存储java中的任何引用类型的数据。
2、在栈中提供push方法模拟压栈。(栈满了,要有提示信息。)
3、在栈中提供pop方法模拟弹栈。(栈空了,也有有提示信息。)
4、编写测试程序,new栈对象,调用push pop方法来模拟压栈弹栈的动作。
首先是我的想法和思路:
既然是模拟栈,那么就要做到先进后出的功能。栈如何去定位当前元素呢?
通过栈帧index。
所以我需要一个index变量去定位每次栈顶的位置,从而去判断栈是否满了
而且还可以在对数组下标为index的变量操作时达到“先进后出”的目的
接着就是题目中要求的“这个栈可以存储java中的任何引用类型的数据。”
意味着我们这个数组要用的是Obeject类型。
至此大体已出
接下来是我的代码:
首先就是MyStack类,这个类是关于栈的模拟
public class MyStack {
Object[] elements;
int index = -1;
public MyStack(Object[] elements) {
this.elements = elements;
}
public void push(Object object){
if(index != elements.length - 1){
index++;
elements[index] = object;
System.out.println("压栈成功");
}else{
System.out.println("错误:栈满!无法压栈!");
}
}
接下来就是关于测试程序了
测试程序MyStackTest
import java.util.Scanner;
public class MyStackTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int length;
System.out.println("请输入栈的大小:");
length = input.nextInt();
String[] a1 = new String[length];
MyStack myStack1 = new MyStack(a1);
int flag = 0;
while(flag != 3){
System.out.println("请输入您要进行的操作:1代表push(压栈),2代表pop(弹栈),3表示停止该操作");
flag = input.nextInt();
if(flag == 1){
String toInPut;
System.out.println("请输入您要压入栈的内容");
toInPut = input.next();
myStack1.push(toInPut);
}else if(flag == 2){
myStack1.pop();
}else if(flag == 3){
break;
}else{
System.out.println("输入不合法!请输入您要进行的操作:1代表push(压栈),2代表pop(弹栈),3表示停止该操作");
}
}
}
}
这就是数组模拟栈。
酒店管理系统的模拟
题目要求
为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能。
1、该系统的用户是:酒店前台。
2、酒店使用一个二维数组来模拟。“Room[][] rooms;”
3、酒店中的每一个房间应该是一个java对象:Room
4、每一个房间Room应该有:房间编号、房间类型、房间是否空闲.
5、系统应该对外提供的功能:可以预定房间:用户输入房间编号,订房。
可以退房:用户输入房间编号,退房。
可以查看房间的状态:用户输入某个指令应该可以查看所有房间状态。
想法和思路:
该题目较为简单,主要思想就是去实现每个功能
题目已经给了要求:用一个Room类和二维数组去实现。
Room类主要是存储每个房间的信息:例如门牌号,是否空闲等
而二维数组则是去存储每个房间。
接下来只需实现即可
我的代码:
首先是实现各个功能以及Room类
注意,这里最好是吧Room类和功能实现分开写,但是我合并了,以后不要这样
public class Room {
static Room[][] rooms = new Room[3][10];
int roomId;
int floor =0,number = 0;
boolean flag = false;
String roomStyle;
public static void Initialization(){
int k,p;
for(k = 0;k < 3;k++){
for(p = 0;p < 10;p++){
rooms[k][p] = new Room();
}
}
}
public void setRoomId(int roomId) {
this.roomId = roomId;
}
public Room(){}
public void reserveRoomId(){
floor = (roomId/100) - 1;
number = (roomId%100) - 1;
}
public void orderRoom(){
if(rooms[floor][number].flag == true){
System.out.println("该房间已满!请另换一间!");
}else{
rooms[floor][number].flag = true;
System.out.println("预订成功!您预订的房间号为:" + roomId + "房间位于第" + (floor+1) + "层0" + (number+1) + "号房");
}
}
public void Check_out(){
if(rooms[floor][number].flag == false){
System.out.println("该房间本就为空!无法退房!");
}else{
rooms[floor][number].flag = false;
System.out.println("退房成功!" + roomId + "房间已成功退房" );
}
}
public void View_information(){
System.out.println("将为您打印全部房间信息:");
int i,j,roomids;
for(i = 0;i < 3;i++){
System.out.println("房间号\t\t房间是否满员\t\t房间类型");
for(j = 0;j < 10;j++){
if(i == 0){
rooms[i][j].roomStyle = "普通房";
}else if(i == 1){
rooms[i][j].roomStyle = "豪华房";
}else{
rooms[i][j].roomStyle = "贵宾房";
}
roomids = ((i+1)*100)+(j+1);
System.out.println(roomids + "\t\t\t" + rooms[i][j].flag + "\t\t\t" + rooms[i][j].roomStyle);
}
}
}
}
接下来就是测试程序
写到测试程序我就意识到得注意程序的用户交互性
用户可能会有各种输入,那么正确的输入我们得去执行功能
而错误的输入我们则得去提醒用户输入错误以及正确的输入方式
这样可以避免很多麻烦
import java.util.Scanner;
public class HotelTest {
public static void main(String[] args) {
int flag = 0;
int roomId;
Scanner input = new Scanner(System.in);
Room.Initialization();
Room room = new Room();
System.out.println("欢迎来到why牌酒店管理系统!~");
System.out.println("本酒店一共有3层楼,每层楼10间房间");
System.out.println("下面请输入:1(预订房间);2(退房);3(查看所有房间信息);4(退出系统)");
while(flag != 4){
flag = input.nextInt();
if(flag == 1){
System.out.println("现在是订房界面:");
System.out.println("请输入房间号:");
System.out.println("注意:房间号每层尾号从1开始到9结束,例如1层3号房就是:103");
roomId = input.nextInt();
if(((roomId/100) >= 1 &&(roomId/100) <=3)&&((roomId%100) >=1&&(roomId%100) <=10)){
room.setRoomId(roomId);
room.reserveRoomId();
room.orderRoom();
}else{
System.out.println("输入房间号错误!注意:房间号每层尾号从1开始到9结束,例如1层3号房就是:103");
}
}else if(flag == 2){
System.out.println("现在是退房界面:");
System.out.println("请输入房间号:");
System.out.println("注意:房间号每层尾号从1开始到9结束,例如1层3号房就是:103");
roomId = input.nextInt();
if(((roomId/100) >= 1 &&(roomId/100) <=3)&&((roomId%100) >=1&&(roomId%100) <=10)){
room.setRoomId(roomId);
room.reserveRoomId();
room.Check_out();
}else{
System.out.println("输入房间号错误!注意:房间号每层尾号从1开始到9结束,例如1层3号房就是:103");
}
}else if(flag == 3){
room.View_information();
}else if(flag == 4){
System.out.println("感谢使用why牌酒店管理系统!已关机!");
break;
}else{
System.out.println("输入错误!请输入:1(预订房间);2(退房);3(查看所有房间信息);4(退出系统)");
}
}
}
}
入上便是我的程序,功能实现完全没问题,那么是不是就没问题了呢?
并不是。
我的程序的问题
在对比了老师写的程序后,我发现了我现在的问题:
虽然会封装,知道要重写方法(例如toString,equal方法)但是不会去用。
在老师的程序中,强调了无论如何,那怕用不上也要对程序封装
然后提供set和get方法,这点是我以后必须得记住的。
至于老师的代码不予提供,自行寻找。