使用一维数组,模拟栈数据结构(Java)

 题目

要求:
        1、这个栈可以存储java中的任何引用类型的数据。
        2、在栈中提供push方法模拟压栈。(栈满了,要有提示信息。)
        3、在栈中提供pop方法模拟弹栈。(栈空了,也有有提示信息。)
        4、编写测试程序,new栈对象,调用push pop方法来模拟压栈弹栈的动作。


考察知识点

1,数据结构中栈的特点

2,自定义异常类(在学完异常后添加)

3,一维数组

栈图

 思路

 public class MyStack{ // 栈类

            // 提供一个数组来存储栈中的元素
            Object[] elements;

            // 栈帧(永远指向栈顶部的元素)
            // 每加1个元素,栈帧+1
            // 每减1个元素,栈帧-1
            int index;

            // 构造方法
            // 构造方法是不是应该给一维数组一个初始化容量。

            // push方法(push方法压栈)
            // 压栈表示栈中多一个元素。
            // 但是栈如果已满,压栈失败。
            // 这个方法的参数以及返回值类型自己定义。

            // pop方法(pop方法弹栈)
            // 弹栈表示栈中少一个元素。
            // 但是栈如果已空,弹栈失败。
            // 这个方法的参数以及返回值类型自己定义。

        }

        main(){
            测试...
        }

源码

模拟栈

public class MyStack {
    // 提供一个数组来存储栈中的元素
    private Object[] elements;
    //栈帧
    private int index;
    /*
        无参构造方法,初始化一维数组和栈帧。
     */
    public MyStack() {
        //默认初始化容量为10.(一维数组动态初始化。)
        this.elements = new Object[10];
        //初始化index
        this.index = -1;
    }

    /*
        压栈方法,ele为被压入的元素。
     */
    public void push(Object ele) throws MyStackOperationException {
        //栈帧指向数组最后一个元素的后面。
        if (index >= elements.length - 1) {
            /* 
            MyStackOperationException e = new MyStackOperationException("压栈失败,栈已满!");
            throw e;
            */
            throw new MyStackOperationException("压栈失败,栈已满!");
        }
        //向栈中加一个元素,栈帧向上移动一个位置
        // index++;
        // this.elements[index]=ele;

        this.elements[++index] = ele;
        System.out.println("压栈" + ele + "成功,栈帧指向:" + index);
    }

    /*
        弹栈方法,从数组中弹出元素
     */
    public void pop() throws MyStackOperationException {
        if (index < 0) {
            /* 
            MyStackOperationException e = new MyStackOperationException("出栈失败,栈已空!");
            throw e;
            */
            throw new MyStackOperationException("出栈失败,栈已空!");
        }
        //从栈中弹出一个元素,栈帧向下移动一位。
        //System.out.print("谈栈" + elements[index] + "成功");
        //index--
        System.out.print("弹栈" + elements[index--] + "成功");
        System.out.println("栈帧指向:"+index);
    }

    public Object[] getElements() {

        return elements;
    }

    public void setElements(Object[] elements) {
        this.elements = elements;
    }
}

自定义异常类

public class MyStackOperationException extends Exception{

    public MyStackOperationException() {
    }

    public MyStackOperationException(String message) {
        super(message);
    }
    
}

主函数

public class text {
    public static void main(String[] args) {
        MyStack stack = new MyStack();
        //压栈
        try {
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            stack.push(new Object());
            //这里栈已满
            stack.push(new Object());
        } catch (MyStackOperationException e) {
            //输出异常简单信息
            System.out.println(e.getMessage());
        }
        //弹栈
        try {
            stack.pop();
            stack.pop();
            stack.pop();
            stack.pop();
            stack.pop();
            stack.pop();
            stack.pop();
            stack.pop();
            stack.pop();
            stack.pop();
            //这里栈已空
            stack.pop();
        } catch (MyStackOperationException e) {
            //输出异常信息
            System.out.println(e.getMessage());
        }
    }
}

心得体会

例题是数组的相关题目,但学习异常后重新用自定义的异常类来表示栈满和栈空情况,意义在于复习以前学习的知识的同时运用新的知识点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值