思路
先进后出,优先解决压栈的问题,之后解决弹栈和main方法
功能
- 随时模拟压栈
- 随时模拟弹栈
- 防止异常和各种错误
- 随时可以遍历“栈”中存在的变量的方法,压栈弹栈栈帧清晰可见!
使用演示:
压栈:
栈满检测:
遍历栈内存和栈帧:
只要栈中有变量就会输出栈帧:
弹栈:
栈空检测:(没有变量,栈帧不输出!)
源码:
- 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模拟压栈弹栈的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/q1942535787/article/details/115605878