• 04-java数据结构之栈的学习


    目录

    一、栈的介绍(Stack)

    二、用数组模拟栈

    2.1、思路分析

    2.2、代码实现

    2.2.1、创建一个类表示栈

    2.2.2、判断栈是否为空

    2.2.3、判断栈是否满

    2.2.4、入栈(push)

    2.2.5、出栈(pop)

    2.2.6、显示栈

    三、测试类

    3.1、测试结果以及代码

    3.2、完整代码


    一、栈的介绍(Stack)

    • 栈是一个先进后出(FILO)的有序列表。
    • 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
    • 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
    • 图解方式说明出栈(pop)和入栈(push)的概念

    二、用数组模拟栈

            用数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来存储栈的数据内容。

    2.1、思路分析

    2.2、代码实现

    2.2.1、创建一个类表示栈

    1. class Stack{
    2. private int maxSize; // 栈的大小
    3. private int[] stack; // 数组,模拟栈
    4. private int top=-1; // top表示栈顶,初始化为-1
    5. // 构造器
    6. public Stack(int maxSize) {
    7. this.maxSize = maxSize;
    8. stack=new int[this.maxSize];
    9. }
    10. }

    2.2.2、判断栈是否为空

    1. // 判断栈是否为空
    2. public boolean isEmpty(){
    3. return top==-1;
    4. }

    2.2.3、判断栈是否满

    1. // 判断栈是否满
    2. public boolean isFull(){
    3. return top+1==maxSize;
    4. }

    2.2.4、入栈(push)

    1. // 入栈
    2. public void push(int value){
    3. // 先判断栈是否满
    4. if(isFull()){
    5. System.out.println("栈满");
    6. return;
    7. }
    8. top++;
    9. stack[top]=value;
    10. }

    2.2.5、出栈(pop)

    1. // 出栈 ,将栈顶元素返回
    2. public int pop(){
    3. if(isEmpty()){
    4. throw new RuntimeException("栈空");
    5. }
    6. int value=stack[top];
    7. top--;
    8. return value;
    9. }

    2.2.6、显示栈

    1. // 显示栈的情况
    2. public void list(){
    3. if(isEmpty()){
    4. System.out.println("栈空");
    5. return;
    6. }
    7. // 需要从栈顶开始显示数据
    8. for(int i=top;i>=0;i--){
    9. System.out.printf("stack[%d]=%d",i,stack[i]);
    10. }
    11. }

    三、测试类

    3.1、测试结果以及代码

    1. public class ArrayStack {
    2. public static void main(String[] args) {
    3. System.out.println("开始测试栈");
    4. Stack stack=new Stack(4);
    5. String key="";
    6. boolean loop=true; // 控制菜单是否退出
    7. Scanner scanner=new Scanner(System.in);
    8. while(loop){
    9. System.out.println("show:显示栈");
    10. System.out.println("exit:退出程序");
    11. System.out.println("push:入栈");
    12. System.out.println("pop:出栈");
    13. System.out.println("请输入你的选择:");
    14. key=scanner.next();
    15. switch (key){
    16. case "show":
    17. stack.list();
    18. break;
    19. case "push":
    20. System.out.println("请输入入栈的数据");
    21. int value=scanner.nextInt();
    22. stack.push(value);
    23. break;
    24. case "pop":
    25. try{
    26. int res=stack.pop();
    27. System.out.printf("出栈的数据是:%d\n",res);
    28. }catch (Exception e){
    29. System.out.println(e.getMessage());
    30. }
    31. break;
    32. case "exit":
    33. scanner.close();
    34. loop=false;
    35. break;
    36. default:
    37. break;
    38. }
    39. }
    40. System.out.println("程序退出");
    41. }
    42. }

    测试结果图:

     

    3.2、完整代码

    1. public class ArrayStack {
    2. public static void main(String[] args) {
    3. System.out.println("开始测试栈");
    4. Stack stack=new Stack(4);
    5. String key="";
    6. boolean loop=true; // 控制菜单是否退出
    7. Scanner scanner=new Scanner(System.in);
    8. while(loop){
    9. System.out.println("show:显示栈");
    10. System.out.println("exit:退出程序");
    11. System.out.println("push:入栈");
    12. System.out.println("pop:出栈");
    13. System.out.printf("请输入你的选择:");
    14. key=scanner.next();
    15. switch (key){
    16. case "show":
    17. stack.list();
    18. break;
    19. case "push":
    20. System.out.printf("请输入入栈的数据:");
    21. int value=scanner.nextInt();
    22. stack.push(value);
    23. break;
    24. case "pop":
    25. try{
    26. int res=stack.pop();
    27. System.out.printf("出栈的数据是:%d\n",res);
    28. }catch (Exception e){
    29. System.out.println(e.getMessage());
    30. }
    31. break;
    32. case "exit":
    33. scanner.close();
    34. loop=false;
    35. break;
    36. default:
    37. break;
    38. }
    39. }
    40. System.out.println("程序退出");
    41. }
    42. }
    43. class Stack{
    44. private int maxSize; // 栈的大小
    45. private int[] stack; // 数组,模拟栈
    46. private int top=-1; // top表示栈顶,初始化为-1
    47. // 构造器
    48. public Stack(int maxSize) {
    49. this.maxSize = maxSize;
    50. stack=new int[this.maxSize];
    51. }
    52. // 判断栈是否为空
    53. public boolean isEmpty(){
    54. return top==-1;
    55. }
    56. // 判断栈是否满
    57. public boolean isFull(){
    58. return top+1==maxSize;
    59. }
    60. // 入栈
    61. public void push(int value){
    62. // 先判断栈是否满
    63. if(isFull()){
    64. System.out.println("栈满");
    65. return;
    66. }
    67. top++;
    68. stack[top]=value;
    69. }
    70. // 出栈 ,将栈顶元素返回
    71. public int pop(){
    72. if(isEmpty()){
    73. throw new RuntimeException("栈空");
    74. }
    75. int value=stack[top];
    76. top--;
    77. return value;
    78. }
    79. // 显示栈的情况
    80. public void list(){
    81. if(isEmpty()){
    82. System.out.println("栈空");
    83. return;
    84. }
    85. // 需要从栈顶开始显示数据
    86. for(int i=top;i>=0;i--){
    87. System.out.printf("stack[%d]=%d\n",i,stack[i]);
    88. }
    89. }
    90. }

  • 相关阅读:
    全链路压测专题---1、全链路压测的思想和方案
    可分离卷积核
    【从零开始学习 SystemVerilog】11.1、SystemVerilog 断言—— Assertions Introduction(断言概述)
    zookeeper工具书 - (zkCli常用命令 + 四字命令)
    集合_Collection_ArrayList扩容机制
    解放你的项目!depcheck:清理无用依赖,让代码更精致
    物联网毕设 -- 基于STM32的心率检测
    知识图谱1_2——下载neo4j客户端
    Vue项目实战——实现GitHub搜索案例(学以致用,两小时带你巩固和强化Vue知识点)
    python 引用、浅拷贝、深拷贝
  • 原文地址:https://blog.csdn.net/qq_56469942/article/details/127415531