当前位置:   article > 正文

数据结构之栈_栈是一种什么数据结构

栈是一种什么数据结构

什么是栈

栈是一种常用的数据结构,其数据存储使用的是逻辑结构。逻辑结构是一个比较抽象的概念,它依赖于物理结构而存在。逻辑结构又分为线性结构和非线性结构。比如顺序表表、栈和队列等就是典型的线性结构,而树和图等就是非线性结构。

栈(Stack)是一种线性数据结构,它就像一个单通道的容器,其中的元素只能先进后出(First In Last Out,简称 FILO)。由于其是单通道的,所以决定了最早进入容器的元素只能最晚出。最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。像栈这种线性结构既可以用数组来实现,也可以用链表来实现。

数组实现如下:

链表实现如下:

栈的基本操作

1.入栈

入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会称为新的栈顶。

 如图所示,已经栈中已有元素3、5、1、4、9、6,其中 3 为栈底元素,6 为栈顶元素,此时有元素 7 需要入栈,那么入栈之后的栈顶元素就变成了 7。

2.出栈

出栈操作(pop),也叫弹栈操作,就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈之后,出栈元素的前一个元素将会成为新的栈顶元素。

如图所示,已知栈中已有元素3、5、1、4、9、6、7,其中 7 为栈顶元素,现在元素 7 想要出栈,那么出栈之后新的栈顶元素就是 6,栈底元素不变。

代码展示

栈的入栈和出栈相关代码代码如下:

  1. package structure.stack;
  2. /**
  3. * @ClassName: Stack
  4. * @Author: jiaomubai
  5. * @Date: 2022/1/30 14:55
  6. * @Description: 栈的出栈与入栈操作
  7. */
  8. public class Stack {
  9. // 存储数据的数组
  10. private int[] dataArray;
  11. // 栈顶元素下标
  12. private int top;
  13. // 栈底元素下标
  14. private int bottom;
  15. public Stack(int capacity) {
  16. this.dataArray = new int[capacity];
  17. }
  18. /**
  19. * 入栈
  20. * @param element
  21. */
  22. public void push(Integer element) {
  23. System.out.println("入栈元素为:" + element);
  24. if (top == dataArray.length) {
  25. System.out.println("栈已满");
  26. return;
  27. }
  28. dataArray[top] = element;
  29. System.out.println("入栈之后栈顶元素为:" + dataArray[top]);
  30. System.out.println("入栈之后栈底元素为:" + dataArray[bottom]);
  31. top++;
  32. System.out.println();
  33. }
  34. /**
  35. * 出栈
  36. * @return
  37. */
  38. public Integer pop() {
  39. if (top == bottom) {
  40. System.out.println("栈已空");
  41. return -1;
  42. }
  43. Integer popElement = dataArray[--top];
  44. System.out.println("出栈元素为:" + popElement);
  45. if (top == -1) {
  46. System.out.println("出栈之后栈顶元素为:" + null);
  47. System.out.println("出栈之后栈底元素为:" + null);
  48. } else {
  49. System.out.println("出栈之后栈顶元素为:" + dataArray[top]);
  50. System.out.println("出栈之后栈底元素为:" + dataArray[bottom]);
  51. }
  52. System.out.println();
  53. return popElement;
  54. }
  55. /**
  56. * 打印
  57. */
  58. public void print() {
  59. for (int i = 0; i < top - 1; i++) {
  60. System.out.print(dataArray[i] + " --> ");
  61. }
  62. if (top == 0) {
  63. System.out.println("空栈");
  64. } else {
  65. System.out.println(dataArray[top - 1]);
  66. }
  67. }
  68. public static void main(String[] args) {
  69. Stack stack = new Stack(6);
  70. stack.push(1);
  71. stack.push(2);
  72. stack.push(3);
  73. stack.push(4);
  74. stack.push(5);
  75. stack.push(6);
  76. stack.push(7);
  77. System.out.println();
  78. stack.print();
  79. System.out.println();
  80. stack.pop();
  81. stack.pop();
  82. stack.pop();
  83. stack.print();
  84. }
  85. }

以上代码是使用数组模拟的一个栈,实际使用时 Java 可直接调用 Stack 相关的 API 即可。如上代码所示,初始化栈时,栈中每个元素都是 0。每有一个元素入栈时,top 自增 1,每有一个元素出栈时,top 自减 1。代码仅供参考,只是实现了出栈和入栈操作,其他向获取栈顶元素等操作并未实现。

入栈和出栈只涉及最后一个元素,不涉及其他元素的整体移动,所以无论是以链表的形式实现,还是以数组的形式实现,入栈、出栈的时间复杂度都是 O(1)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/581651
推荐阅读
相关标签
  

闽ICP备14008679号