数据结构与算法-栈

ゝ一世哀愁。 2024-03-31 10:56 208阅读 0赞

什么是栈
栈又称为堆栈,是一种运算受限定表。说是限定表是由于对于元素的入栈和出栈都在表末尾进行,换言之就是先进后出,其本质就是对表尾部元素进行操作。在计算机系统中,栈是具有以上属性的动态内存区域。由于数据结构都是数组和指针的组合,故我们可以用JAVA数组来进行模拟。

算法原理
定义变量:TOP-栈顶指针 N-当前数组容器长度 S-数组 X-元素
1、入栈(PUSH)算法
1.1 首先判断指针 TOP +1 > N-1,满足则进行动态扩容后进入下一步,否则直接进入下一步
1.2 TOP++ 增加指针指向栈顶
1.3 S(TOP) = X 将元素赋值给栈顶索引

2、出栈(POP)算法
2.1 首先判断 TOP-1 < 0,满足抛出异常没有可出栈元素,否则进入下一步
2.2 X=S(TOP) 获取待出栈元素已备后续返回使用
2.3 S(TOP) = NULL,TOP— 置空栈顶元素,减少指针指向栈顶

小试牛刀
1、创建栈方法,并提供模拟动态扩容、出入栈、获取栈顶元素等方法

  1. /**
  2. * 数据结构-栈
  3. * @author senfel
  4. * @version 1.0
  5. * @date 2022/11/24 11:01
  6. */
  7. @Slf4j
  8. public class Stack {
  9. /**
  10. * 栈数组
  11. */
  12. private Object[] elementArray;
  13. /**
  14. * 栈顶指针
  15. */
  16. private Integer top;
  17. /**
  18. * 栈深度
  19. */
  20. private Integer deepness;
  21. /**
  22. * 默认栈深度为10的构造方法
  23. */
  24. public Stack() {
  25. this.elementArray = new Object[10];
  26. this.top = -1;
  27. this.deepness = 10;
  28. }
  29. /**
  30. * 提供有个传入栈深度的构造方法
  31. * @param deepness
  32. */
  33. public Stack(Integer deepness) {
  34. this.elementArray = new Object[deepness];
  35. this.top = -1;
  36. this.deepness = deepness;
  37. }
  38. /**
  39. * 扩容方法
  40. * 1、判断是否需要扩容
  41. * 2、需要扩容则扩大两倍的量
  42. * @param topIndex
  43. * @author senfel
  44. * @date 2022/11/24 11:08
  45. * @return void
  46. */
  47. public void grow(Integer topIndex){
  48. //缓存当前栈深度
  49. Integer currentDeepness = deepness;
  50. //由于top为索引故栈顶深度 == index+ 1
  51. if(topIndex + 1 > deepness){
  52. //需要扩容并验证扩容后是否超过int取值范围
  53. if(currentDeepness * 2 > Integer.MAX_VALUE){
  54. deepness = Integer.MAX_VALUE;
  55. }else{
  56. deepness = currentDeepness * 2;
  57. }
  58. //对栈内元素重新分配索引
  59. elementArray = Arrays.copyOf(elementArray, deepness);
  60. }
  61. }
  62. /**
  63. * 验证栈是否为空
  64. * @author senfel
  65. * @date 2022/11/24 11:23
  66. * @return java.lang.Boolean
  67. */
  68. public Boolean isEmpty(){
  69. if(top > -1){
  70. return false;
  71. }else{
  72. return true;
  73. }
  74. }
  75. /**
  76. * 入栈
  77. * @param element
  78. * @author senfel
  79. * @date 2022/11/24 11:19
  80. * @return void
  81. */
  82. public void push(Object element){
  83. //扩容并移动栈顶指针
  84. grow(++top);
  85. //元素压入栈顶
  86. elementArray[top] = element;
  87. }
  88. /**
  89. * 获取栈顶元素
  90. * @author senfel
  91. * @date 2022/11/24 11:21
  92. * @return void
  93. */
  94. public Object peek(){
  95. if(isEmpty()){
  96. return null;
  97. }
  98. return elementArray[top];
  99. }
  100. /**
  101. * 弹出栈顶元素
  102. * @author senfel
  103. * @date 2022/11/24 11:24
  104. * @return java.lang.Object
  105. */
  106. public void pop(){
  107. //获取栈顶元素
  108. Object peek = peek();
  109. if(Objects.isNull(peek)){
  110. throw new EmptyStackException();
  111. }
  112. elementArray[top] = null;
  113. top--;
  114. }
  115. }

2、提供测试方法

  1. public static void main(String[] args) {
  2. Stack stack = new Stack(8);
  3. log.error("初始栈{}",Arrays.toString(stack.elementArray));
  4. //当前栈是否为空
  5. log.error("当前栈是否为空:{}",stack.isEmpty());
  6. for(int i = 0;i< 10;i++){
  7. stack.push(i);
  8. }
  9. log.error("入栈后的栈结构为{}",Arrays.toString(stack.elementArray));
  10. log.error("当前栈顶元素为:{}",stack.peek());
  11. //模拟出栈两次
  12. stack.pop();
  13. stack.pop();
  14. log.error("出栈两次栈后的栈结构为{}",Arrays.toString(stack.elementArray));
  15. log.error("当前栈顶元素为:{}",stack.peek());
  16. }

3、展示测试结果

11:46:30.740 - 初始栈[null, null, null, null, null, null, null, null]
11:46:30.743 - 当前栈是否为空:true
11:46:30.743 - 入栈后的栈结构为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, null, null, null, null, null, null]
11:46:30.743 - 当前栈顶元素为:9
11:46:30.743 - 出栈两次栈后的栈结构为[0, 1, 2, 3, 4, 5, 6, 7, null, null, null, null, null, null, null, null]
11:46:30.743 - 当前栈顶元素为:7

发表评论

表情:
评论列表 (有 0 条评论,208人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构算法-

    什么是栈 栈又称为堆栈,是一种运算受限定表。说是限定表是由于对于元素的入栈和出栈都在表末尾进行,换言之就是先进后出,其本质就是对表尾部元素进行操作。在计算机系统中,栈是具有

    相关 数据结构算法

    数据结构与算法 栈 一、简述       栈是一种只能在一端进行插入或删除操作的线性表。进行插入、删除的一端称为栈顶,栈顶的当前位置是动态的,由一个称为栈顶指针的位置指

    相关 数据结构算法

    前言 在前面几篇我们有讲到数组,链表等数据结构,这些都是存储数据的最基本的结构。而本篇文章讲解的则是利用算法和数据结构来实现一些小工具,来解决现实中某种需求。它就是栈。