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

时间:2021-11-24 06:56:14

思路

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

功能

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

使用演示:

压栈:

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

栈满检测:

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

遍历栈内存和栈帧:

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

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

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

弹栈:

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

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

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

源码:

  1. import java.util.Scanner;
  2. public class MoveTest01 {
  3. //局部变量供栈方法的遍历数组使用
  4. static int i;
  5. //创建Object[]数组,作为栈,并且限制“内存上限”为5;
  6. static Object[] os = new Object[5];
  7. //创建数组,模拟入栈
  8. static num[] l = {new A(),new B(),new C(),new D(),new E(),new F()};
  9. </p> public static void main(String[] args) {
  10. int a =0;//遍历Object[]数组时的控制
  11. boolean c = true;//控制循环
  12. boolean d = true;//检测栈内存使用量防止异常
  13. Scanner s = new Scanner(System.in);
  14. do {
  15. System.out.println("===========================");
  16. System.out.print("请选择”压栈““弹栈”或“列出栈内存中储存的变量指向的方法”,输入“退出”将会结束程序!:");
  17. String z = s.next();
  18. //判定用户输入
  19. if (z.equals("压栈")) {
  20. //防止数列超限
  21. if(a > (os.length - 1)){
  22. d = false;
  23. System.out.println("栈内存已满!请弹栈后压栈!");
  24. }
  25. if(d){
  26. //调用num[]数组模拟入栈
  27. l[a].leng();
  28. a++; }
  29. //防止if(d)锁死
  30. d = true;
  31. } else if (z.equals("弹栈")) {
  32. //调用pop方法,模拟弹栈,并初始化计数
  33. pop();
  34. a = 0;
  35. i = 0;
  36. } else if (z.equals("退出")) {
  37. //结束do...while循环体
  38. c = false;
  39. } else if (z.equals("列出栈内存中储存的变量指向的方法")) {
  40. int index = -1;//创建栈帧
  41. if(os[0] == null){
  42. System.out.println("栈内没有已装载的变量!");
  43. }
  44. for (int k = os.length - 1; k > -1; k--) {
  45. //判定如果Object[]数组内的各个属性,如果不等于null则输出声明
  46. if(!(os[k] == null)){
  47. index++;
  48. System.out.println("栈内存中已入栈的变量的方法有:" + os[k]);
  49. }
  50. }
  51. //如果栈帧的值不为0,则输出结果
  52. if(!(index == -1)){
  53. System.out.println(os[index] + "《== 栈帧指向");
  54. }
  55. }
  56. }while (c);
  57. }
  58. //模拟栈
  59. public static void Zhan(Object o){
  60. if(i < os.length) {
  61. //给Object[]数组赋值
  62. os[i] = o;
  63. System.out.println("目标:" + os[i] + "的所有变量已压入栈内!");
  64. i++;
  65. }
  66. }
  67. </p> public static void push(String c){
  68. //接收下面类传来的参数并赋值给Zhan()
  69. Zhan(c);
  70. }
  71. </p> public static void pop(){
  72. //检测数组第一位的值是不是空,如果是则输出消息
  73. if(os[0] == null){
  74. System.out.println("栈内没有已装载的变量!无法弹栈!");
  75. }
  76. //模拟弹栈
  77. for(int k = (os.length - 1);k >= 0;k--){
  78. //遍历数组,将数组内不是null的值全部输出并初始化为null
  79. if(!(os[k] == null)) {
  80. System.out.println(os[k] + "的所有变量:已弹出内存!");
  81. os[k] = null;
  82. }
  83. }
  84. }
  85. }
  86. class num{
  87. public void leng(){
  88. //让下面的方法有个共同的父类,并且调用时统一输出自己的名字给栈
  89. MoveTest01.push(getClass().getName());
  90. }
  91. }
  92. //即将入方法区的方法,假设里面有变量(也可以直接把这些方法看成变量);
  93. class A extends num{
  94. public A() {}
  95. }
  96. class B extends num{
  97. public B() {}
  98. }
  99. class C extends num{
  100. public C() {}
  101. }
  102. class D extends num{
  103. public D() {}
  104. }
  105. class E extends num{
  106. public E() {}
  107. }
  108. class F extends num{
  109. public F() {}
  110. }

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

原文链接:https://blog.csdn.net/q1942535787/article/details/115605878