使用java一维数组模拟压栈弹栈

 更新时间:2021年04月13日 16:37:52   作者:Lib_Subsidiary  
这篇文章主要介绍了如何使用java一维数组模拟压栈弹栈,需要的朋友可以参考下

思路

先进后出,优先解决压栈的问题,之后解决弹栈和main方法

功能

  1. 随时模拟压栈
  2. 随时模拟弹栈
  3. 防止异常和各种错误
  4. 随时可以遍历“栈”中存在的变量的方法,压栈弹栈栈帧清晰可见!

使用演示:

压栈:

在这里插入图片描述

栈满检测:

在这里插入图片描述

遍历栈内存和栈帧:

只要栈中有变量就会输出栈帧:

弹栈:

在这里插入图片描述

栈空检测:(没有变量,栈帧不输出!)

在这里插入图片描述

源码:

import java.util.Scanner;
public class MoveTest01 {
    //局部变量供栈方法的遍历数组使用
    static int i;
    //创建Object[]数组,作为栈,并且限制“内存上限”为5;
    static Object[] os = new Object[5];
    //创建数组,模拟入栈
    static num[] l = {new A(),new B(),new C(),new D(),new E(),new F()};
</p>    public static void main(String[] args) {
        int a =0;//遍历Object[]数组时的控制
        boolean c = true;//控制循环
        boolean d = true;//检测栈内存使用量防止异常
        Scanner s = new Scanner(System.in);
        do {
            System.out.println("===========================");
            System.out.print("请选择”压栈““弹栈”或“列出栈内存中储存的变量指向的方法”,输入“退出”将会结束程序!:");
            String z = s.next();
            //判定用户输入
            if (z.equals("压栈")) {
                //防止数列超限
                if(a > (os.length - 1)){
                    d = false;
                    System.out.println("栈内存已满!请弹栈后压栈!");
                }
		if(d){
                  //调用num[]数组模拟入栈
                  l[a].leng();
                  a++;                }
                //防止if(d)锁死
                d = true;
            } else if (z.equals("弹栈")) {
                //调用pop方法,模拟弹栈,并初始化计数
                pop();
                a = 0;
                i = 0;
            } else if (z.equals("退出")) {
                //结束do...while循环体
                c = false;
            } else if (z.equals("列出栈内存中储存的变量指向的方法")) {
                int index = -1;//创建栈帧
                if(os[0] == null){
                    System.out.println("栈内没有已装载的变量!");
                }
                for (int k = os.length - 1; k > -1; k--) {
                    //判定如果Object[]数组内的各个属性,如果不等于null则输出声明
                    if(!(os[k] == null)){
                        index++;
                        System.out.println("栈内存中已入栈的变量的方法有:" + os[k]);
                    }
                }
                //如果栈帧的值不为0,则输出结果
                if(!(index == -1)){
                    System.out.println(os[index] + "《== 栈帧指向");
                }
            }
        }while (c);
    }
    //模拟栈
    public static void Zhan(Object o){
        if(i < os.length) {
            //给Object[]数组赋值
            os[i] = o;
            System.out.println("目标:" + os[i] + "的所有变量已压入栈内!");
            i++;
        }
    }
</p>    public static void push(String c){
        //接收下面类传来的参数并赋值给Zhan()
        Zhan(c);
    }
</p>    public static void pop(){
        //检测数组第一位的值是不是空,如果是则输出消息
        if(os[0] == null){
            System.out.println("栈内没有已装载的变量!无法弹栈!");
        }
        //模拟弹栈
        for(int k = (os.length - 1);k >= 0;k--){
            //遍历数组,将数组内不是null的值全部输出并初始化为null
            if(!(os[k] == null)) {
                System.out.println(os[k] + "的所有变量:已弹出内存!");
                os[k] = null;
            }
        }
    }
}
class num{
    public void leng(){
        //让下面的方法有个共同的父类,并且调用时统一输出自己的名字给栈
        MoveTest01.push(getClass().getName());
    }
}
//即将入方法区的方法,假设里面有变量(也可以直接把这些方法看成变量);
class A extends num{
    public A() {}
}
class B extends num{
    public B() {}
}
class C extends num{
    public C() {}
}
class D extends num{
    public D() {}
}
class E extends num{
    public E() {}
}
class F extends num{
    public F() {}
}

以上就是使用java一维数组模拟压栈弹栈的详细内容,有兴趣的朋友可直接试一试,更多关于java模拟压栈弹栈的资料请关注脚本之家其它相关文章!

相关文章

  • Java多线程的其他知识_动力节点Java学院整理

    Java多线程的其他知识_动力节点Java学院整理

    这篇文章主要介绍了Java多线程的其他知识,需要的朋友可以参考下
    2017-05-05
  • 深入理解LinkedHashSet集合的底层机制

    深入理解LinkedHashSet集合的底层机制

    这篇文章主要介绍了LinkedHashSet的底层机制详解,LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序, 这使得元素看起来是以插入顺序保存的,需要的朋友可以参考下
    2023-10-10
  • 浅谈springMVC拦截器和过滤器总结

    浅谈springMVC拦截器和过滤器总结

    本篇文章主要介绍了springMVC拦截器和过滤器总结,可以用来对访问的url进行拦截处理,有兴趣的可以了解一下。
    2017-01-01
  • 深入理解MyBatis中的一级缓存与二级缓存

    深入理解MyBatis中的一级缓存与二级缓存

    这篇文章主要给大家深入的介绍了关于MyBatis中一级缓存与二级缓存的相关资料,文中详细介绍MyBatis中一级缓存与二级缓存的工作原理及使用,对大家具有一定的参考性学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • SpringBoot接口访问频率限制的实现方式

    SpringBoot接口访问频率限制的实现方式

    接口访问频率限制是通过在一定时间内限制用户对接口的访问次数来实现的,在Spring Boot中,我们可以通过多种方式来实现接口的限流,如使用过滤器、拦截器或者借助第三方库,本文给大家讲解的非常详细,需要的朋友可以参考下
    2024-07-07
  • Spring Boot 如何生成微信小程序短连接及发送短信在短信中打开小程序操作

    Spring Boot 如何生成微信小程序短连接及发送短信在短信中打开小程序操作

    最近遇到这样的需求需要发送短信,通过短信中的短连接打开小程序操作,下面小编给大家分享Spring Boot 如何生成微信小程序短连接发送短信在短信中打开小程序操作,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • SpringBoot整合Elasticsearch7.2.0的实现方法

    SpringBoot整合Elasticsearch7.2.0的实现方法

    这篇文章主要介绍了SpringBoot整合Elasticsearch7.2.0的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Netty分布式pipeline管道传播事件的逻辑总结分析

    Netty分布式pipeline管道传播事件的逻辑总结分析

    这篇文章主要为大家介绍了Netty分布式pipeline管道传播事件总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java常用集合与映射的线程安全问题小结

    Java常用集合与映射的线程安全问题小结

    本文给大家介绍Java常用集合与映射的线程安全问题小结,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-04-04
  • SpringBoot 整合Jest实例代码讲解

    SpringBoot 整合Jest实例代码讲解

    本文通过实例代码给大家介绍了SpringBoot 整合Jest的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08

最新评论