栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Surpass Day15——Java 数组模拟栈数据结构、酒店管理系统

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Surpass Day15——Java 数组模拟栈数据结构、酒店管理系统

目录

1、数组模拟栈数据结构

1.1 题目要求

1.2 代码呈现

1.3 问题展现

2、酒店管理系统

2.1 题目要求

2.2  代码呈现

2.3 问题展现


1、数组模拟栈数据结构

1.1 题目要求

1)这个栈可以存储java中的任何引用类型的数据;

2)在栈中提供push方法模拟压栈;(栈满了,要有提示信息)

3)在栈中提供pop方法模拟压栈;(栈空了,要有提示信息)

4)编写测试程序,new栈对象,调用push pop方法来模拟压栈弹栈操作;

5)假设栈的默认初始化容量是10;

1.2 代码呈现
public class Text {
    public static void main(String[] args) {
        //创建一个栈对象,初始化容量是10个
        Stack s = new Stack();
        s.push("12345ty");
        s.push(new Object());
        s.push(new Object());
        s.push(new Object());
        s.push(new Object());
        s.pop();
        s.pop();
        s.pop();
        s.pop();
        s.pop();
        s.pop();
        //可以使用for循环进行压栈和弹栈
    }
}
class Stack{
    //存储任何引用类型数据的数组
    private Object[] elements;
    //有参构造方法
    public Stack(Object[] elements) {
        this.elements = elements;
    }
    //无参构造方法
    public Stack() {
        //一维数组动态初始化
        //默认初始化容量为10
        this.elements = new Object[10];
    }
    //栈帧(永远指向栈顶元素)
    private int index=-1;
​
    //压栈方法
    public void push(Object obj){
        if(this.index >= this.elements.length-1){
            System.out.println("栈内存已满,压栈失败");
            return;
        }
        index++;
        elements[index] = obj;
        System.out.println(obj + "元素,压栈成功,栈帧指向" + index);
    }
​
    //弹栈方法
    public void pop(){
        if(this.index <= -1) {
            System.out.println("栈内存已空,弹栈栈失败");
        }
        else
            System.out.println(elements[index] + "元素,弹栈成功,栈帧指向" + --index);
    }
​
    //static实例变量的get方法
    public Object[] getElements() {
        return elements;
    }
    //static实例变量的set方法
    public void setElements(Object[] elements) {
        this.elements = elements;
    }
    //实例变量栈帧的get方法
    public int getIndex() {
        return index;
    }
    //实例变量栈帧的set方法
    public void setIndex(int index) {
        this.index = index;
    }
}

1.3 问题展现

1)为什么选择Object类型数组?

因为这个栈可以存储java中任何引用类型的数据

new Animal( )对象和new Peaple( )对象包括字符串都可以放进去,因为Animal和Peaple的超级费雷都是Object;

Object [ ] 是一个万能的口袋,这个口袋可以装任何引用数据类型的数据

2)关于字符串

字符串其实是一个字符串对象,但在java中字符串有优待,不需要new也是一个对象

String s = "asdfghj";
​
String s = new String("asdfghj");

3)关于set和get方法

在类中,大多采用封装机制,所以set和get方法有时候虽然用不到,但也需要写上

4)数组的初始化

数组的初始化可以在定义时直接初始化

this.elements = new Object [10];//赋值也是在构造方法调用的时候初始化

也可以在构造方法中初始化

 public Stack() {
        this.elements = new Object[10];
    }

5)关于System.out.println()方法

所有的System.out.println()方法在执行时,如果输出引用,自动调用引用的toString()方法

e.g.:System.out.println(obj + "元素,压栈成功");这里的obj其实调用了toString()方法


2、酒店管理系统

2.1 题目要求

为某酒店编写程序:酒店管理程序,模拟订房、退房、打印所有房间状态等功能

1)该系统的用户是:酒店前台

2)酒店使用一个二维数组来模拟"Room[ ] [ ] rooms;"

3)酒店中的每一个房间应该是一个java对象:Room;

4)每一个房间Room应该有:房间编号、房间类型属性、房间是否为空;

5)系统对外提供的功能:

可以预定房间:用户输入房间编号,订房

可以退房:用户输入房间编号,退房;

可以查看所有房间的状态:用户输入某个指令应该可以查看所有房间的状态

2.2  代码呈现
import java.util.Scanner;
​
public class HotelSystem {
    public static void main(String[] args) {
        //创建酒店对象
        Hotel hotel = new Hotel();
        Scanner s = new Scanner(System.in);
        Scanner roomNo = new Scanner(System.in);
        meau();
        while(true){
            int i = s.nextInt();
            switch (i){
                case 1:
                    hotel.print();break;
                case 2:
                    System.out.println("请输入预定的房间号");
                    hotel.order(roomNo.nextInt());break;
                case 3:
                    System.out.println("请输入退订的房间号");
                    hotel.exit(roomNo.nextInt());break;
                case 0:
                    return;
            }
        }
    }
    public static void meau(){
        //欢迎页面
        System.out.println("_____________________________________________________________________ ");
        System.out.println("**********************┍------------------------┑ *******************");
        System.out.println("**********************   欢迎使用酒店管理系统     ********************");
        System.out.println("**********************┕------------------------┙ *******************");
        System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx菜单xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
        System.out.println("====================================================================");
        System.out.println(".......      1.查看房间         ......         2.表示订房      .......");
        System.out.println(".......      3.表示退房         ......         0.退出系统      .......");
        System.out.println("____________________________________________________________________");
        System.out.println("请输入功能编号:");
    }
}
class Room{
    //房间号
    private int no;
    //房间类型
    private String type;
    //房间状态
    private boolean status;
    //重写Object中的toString方法,返回一个含有三个信息的字符串
    public String toString() {
        return "["+no+","+type+","+(status ? "空闲":"占用")+"]";
    }
    //重写Object中的equals方法,若房间号相同则两个对象相同
    public boolean equals(Object obj){
        if(obj == null||!(obj instanceof Room)) return false;
        if(this == obj) return true;
        Room room = (Room)obj;
        return room.getNo()==this.no;
    }
​
    public Room(int no, String type, boolean status) {
        this.no = no;
        this.type = type;
        this.status = status;
    }
​
    public Room() {
    }
​
    public int getNo() {
        return no;
    }
​
    public String getType() {
        return type;
    }
​
    public boolean isStatus() {
        return status;
    }
​
    public void setNo(int no) {
        this.no = no;
    }
​
    public void setType(String type) {
        this.type = type;
    }
​
    public void setStatus(boolean status) {
        this.status = status;
    }
}
class Hotel {
    //二维数组模拟酒店房间
    private Room[][] rooms;
​
    //通过构造方法来盖楼
    public Hotel(){
    //房间编号,房间类型,房间状态
        rooms = new Room[3][10];
        //创建30个对象,放到数组中
        for (int i = 0;i < rooms.length;i++){
            for (int j = 0;j < rooms[i].length;j++){
                if(i==0){
                    rooms[i][j] = new Room((i+1)*100+j+1,"单人间",true);
                }
                else if(i==1){
                    rooms[i][j] = new Room((i+1)*100+j+1,"标准间",true);
                }
                else if(i==2){
                    rooms[i][j] = new Room((i+1)*100+j+1,"豪华间",true);
                }
            }
        }
    }
    //在酒店对象上提供一个打印房间列表的方法
    public void print(){
        for (int i = 0;i < rooms.length;i++){
            for (int j = 0;j < rooms[i].length;j++) {
                System.out.print(rooms[i][j]);
            }
            System.out.println();
        }
    }
    //在酒店对象上提供一个订房的方法
    public void order(int roomNo){
        //最主要的是将房间状态修改为false
        Room room = rooms[roomNo / 100 -1][roomNo % 100-1];
        if(room.isStatus()==false){
            System.out.println("该房已被预定!请重新选择!");
            return;
        }
        room.setStatus(false);
        System.out.println(roomNo + "已定房!");
    }
    //在酒店对象上提供一个退房的方法
    public void exit(int roomNo){
        //最主要的是将房间状态修改为true
        Room room = rooms[roomNo / 100 -1][roomNo % 100-1];
        if(room.isStatus()==true){
            System.out.println("该房已被退订!");
            return;
        }
        room.setStatus(true);
        System.out.println(roomNo + "已退房!");
    }
}

2.3 问题展现

1)equals方法重写

equals是用来比较两个字符串对象是否相等的,至于怎么比较程序员自己决定;

你认为两个房间的编号相等就表示同一个房间,那么你写代码标记房间编号就行

2)toString方法重写

toString方法的目的是将java对象转换成字符串形式,怎么转,转成什么形式程序员自己定,可以重写后不转成内存地址

public String toString(){
    //return "[101,单人间,占用]"
    //动态
    return "["+no+","+type+","+(status ? "空闲":"占用")+"]"
}

3)如何把一个变量塞到一个字符串当中,口诀:加一个双引号,双引号中间加两个加号,两个加号中间加变量名

"["+no+","+type+","+(status ? "空闲":"占用")+"]"

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号