Java-利用一维数组模拟栈数据结构


前言

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

一、栈的工作原理

首先在写程序之前,要弄清楚栈的工作原理。
我理解的栈就是栈相当于一个有开口的容器(比如水杯…)。
压栈就是有一个元素需要进入容器里,那它的位置一定是在栈顶。
弹栈就是如果栈里的元素想出来,必须是栈顶的元素先出来。
其实就是一个先进后出的原理。

二、代码实现

1.创建一个类来模拟栈

public class StackModel {
   private Object[] elements;
    public int sf=0;

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

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

    public Object[] getElements() {
        return elements;
    }

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

    public int getSf() {
        return sf;
    }

    public void setSf(int sf) {
        this.sf = sf;
    }

这里我使用的是idea开发工具,在这个类中我定义了一个Object类型的数组,数组中只能存储本类型数据和子类型数据,因为题目要求可以存储任何引用类型的数据,而Object类是所有类的超级父类,所以Object类型的数组可以存放所有类型的数据。然后定义了一个int类型的栈帧sf,栈帧就是永远指向栈顶部的元素位置。最后用idea工具自动生成有参,无参的构造方法,然后我在无参的构造方法里初始化了数组容量为10,为了方便哈哈。

2.push和pop方法代码实现

push方法:

public void push(Object org){
        if (elements[elements.length-1]!=null) {
            System.out.println(org+"压栈失败");
            return;
        }
        for (int i = 0;i<elements.length; i++){
            if(this.elements[i]==null){
                elements[i]=org;
                sf=i;
                System.out.println(org+"成功压栈,栈帧指向"+sf);
                return;
                }
        }

代码原理:调用这个方法时,我先用if语句进行判断数组最后的位置是否为空,如果不为空那么说明栈已满没空间了直接return结束方法提示压栈失败。如果为空那么就可以压栈执行下面代码。这里我进行了一个for循环来查找数组第一次为空的位置,这个位置就是元素进行压栈的位置,找到之后把用户传入的数据存放到这个位置,栈帧sf也指向这个位置,输出压栈成功,栈帧指向的位置然后直接return结束方法和for循环。这里我感觉加个break会不会安全些,我为了少写点代码就这样写了,也没报错哈哈。
pop方法:

public void pop(){
        if (elements[0]==null) {
            System.out.println("弹栈失败");
            return;
        }
        for (int i = elements.length-1;i>-1; i--){
            if(this.elements[i]!=null){
                elements[i]=null;
                sf=i-1;
                System.out.println("成功弹栈,栈帧指向"+sf);
                return;
            }
        }

方法原理和push方法差不多,先判断数组栈底是否为空,如果是空就无法弹栈,打印输出“弹栈失败”。不为空执行for循环从数组尾部向头部找第一个不为空的位置,执行弹栈操作,将这个位置的元素扔出去赋值为空,栈帧指向下一个元素位置。
说明:这里的this就是这个对象本身,我的这段程序可写可不写,但如果方法的形参和局部变量一样时就要加this用于区分。

3.测试代码和运行结果

public class StackTest {
    public static void main(String[] args) {
        StackModel A = new StackModel();
        for (int i = 0; i < 11; i++) {
            A.push(i);
        }
        for (int i = 0; i <13 ; i++) {
            A.pop();
        }
    }
}
C:\Users\86132\IdeaProjects\javase\out\production\stackmodle" StackTest
0成功压栈,栈帧指向0
1成功压栈,栈帧指向1
2成功压栈,栈帧指向2
3成功压栈,栈帧指向3
4成功压栈,栈帧指向4
5成功压栈,栈帧指向5
6成功压栈,栈帧指向6
7成功压栈,栈帧指向7
8成功压栈,栈帧指向8
9成功压栈,栈帧指向9
10压栈失败
成功弹栈,栈帧指向8
成功弹栈,栈帧指向7
成功弹栈,栈帧指向6
成功弹栈,栈帧指向5
成功弹栈,栈帧指向4
成功弹栈,栈帧指向3
成功弹栈,栈帧指向2
成功弹栈,栈帧指向1
成功弹栈,栈帧指向0
成功弹栈,栈帧指向-1
弹栈失败
弹栈失败
弹栈失败

Process finished with exit code 0

这里的测试代码直接通过无参的构造方法new一个StackModel对象A。通过A调用push和pop方法,然后用for循环重复这个代码,最后的执行结果也是ok的。

总结

这应该算是我自己独立完成的第一个java小程序吧,看到运行成功还是有点小成就感的哈哈。然后代码写的不好的地方还希望大佬们多提点意见。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柏城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值