当前位置:   article > 正文

数据结构:栈的概念并且用Java实现栈(两种方法,顺序栈和链式栈)_java用顺序栈和链栈实现入栈和出栈操作

java用顺序栈和链栈实现入栈和出栈操作

栈的概念

后进先出法

简    称 LIFO

栈是一种只允许在一端进行插入或删除的线性表。

1、栈的操作端通常被称为栈顶,另一端被称为栈底。
2、栈的插入操作称为进栈(压栈|push);栈删除操作称为出栈(弹栈|pop)。

特点

栈就像一个杯子,我们只能从杯口放和取,所以栈中的元素是“先进后出”的特点。

存储结构

顺序存储的栈称为顺序栈;链式存储的栈称为链式栈。

java实现

我们可以围绕栈的4个元素来实现栈:

2状态:是否栈空;是否栈满。

2操作:压栈push;进栈pop。

顺序栈的实现

  顺序栈示意图:

 代码实现

  1. package LinearTable.Stack;
  2. import java.util.Arrays;
  3. /**
  4. * 数组实现栈
  5. * @param <T>
  6. */
  7. class Mystack1<T> {
  8. //实现栈的数组
  9. private Object[] stack;
  10. //数组大小
  11. private int size;
  12. //初始化数组
  13. Mystack1() {
  14. stack = new Object[10];//初始容量为10
  15. }
  16. //判断是否为空
  17. public boolean isEmpty() {
  18. return size == 0;
  19. }
  20. //返回栈顶元素
  21. public T peek() {
  22. T t = null;
  23. if (size > 0)
  24. t = (T) stack[size - 1];
  25. return t;
  26. }
  27. //入栈
  28. public void push(T t) {
  29. expandCapacity(size + 1);
  30. stack[size] = t;
  31. size++;
  32. }
  33. //出栈
  34. public T pop() {
  35. //移到栈顶,准备出栈
  36. T t = peek();
  37. if (size > 0) {
  38. stack[size - 1] = null;
  39. size--;
  40. }
  41. return t;
  42. }
  43. //如果栈满了就需要扩大容量
  44. public void expandCapacity(int size) {
  45. int len = stack.length;
  46. if (size > len) {
  47. size = size * 2;//每次扩大一倍
  48. //Java里面数组扩大的方法Arrays.copyOf()
  49. stack = Arrays.copyOf(stack, size);
  50. }
  51. }
  52. }
  53. public class ArrayStack {
  54. public static void main(String[] args) {
  55. Mystack1<String> stack = new Mystack1<>();
  56. System.out.println(stack.peek());
  57. System.out.println(stack.isEmpty());
  58. stack.push("java");
  59. stack.push("is");
  60. stack.push("beautiful");
  61. stack.push("language");
  62. System.out.println(stack.pop());
  63. System.out.println(stack.isEmpty());
  64. System.out.println(stack.peek());
  65. }
  66. }

链式栈的实现

   链式栈示意图:

 代码实现

  1. package LinearTable.Stack;
  2. /**
  3. * 链表实现栈
  4. *
  5. * @param <T>
  6. */
  7. class Mystack2<T> {
  8. //定义链表
  9. class Node<T> {
  10. //定义数据类型泛型T
  11. private T t;
  12. //定义指针
  13. private Node next;
  14. }
  15. //定义头节点
  16. private Node<T> head;
  17. //构造函数初始化头指针
  18. Mystack2() {
  19. head = null;
  20. }
  21. //入栈
  22. public void push(T t) {
  23. if (t == null) {
  24. throw new NullPointerException("参数不能为空");
  25. }
  26. if (head == null) {
  27. //创造的新节点
  28. head = new Node<T>();
  29. head.t = t;
  30. //next指针指向下一个位置
  31. head.next = null;
  32. } else {
  33. //头节点指向的位置
  34. Node<T> temp = head;
  35. //创建新节点
  36. head = new Node<>();
  37. head.t = t;
  38. head.next = temp;
  39. }
  40. }
  41. //出栈
  42. public T pop() {
  43. T t = head.t;
  44. head = head.next;
  45. return t;
  46. }
  47. //栈顶元素
  48. public T peek() {
  49. T t = head.t;
  50. return t;
  51. }
  52. //栈空
  53. public boolean isEmpty() {
  54. if (head == null)
  55. return true;
  56. else
  57. return false;
  58. }
  59. }
  60. public class LinkStack {
  61. public static void main(String[] args) {
  62. Mystack2 stack = new Mystack2();
  63. System.out.println(stack.isEmpty());
  64. stack.push("Java");
  65. stack.push("is");
  66. stack.push("beautiful");
  67. System.out.println(stack.peek());
  68. System.out.println(stack.peek());
  69. System.out.println(stack.pop());
  70. System.out.println(stack.pop());
  71. System.out.println(stack.isEmpty());
  72. System.out.println(stack.pop());
  73. System.out.println(stack.isEmpty());
  74. }
  75. }

需要小伙伴们自己多看几遍理清链表运行的逻辑思路

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

闽ICP备14008679号