当前位置:   article > 正文

Java17——用数组和链表实现栈_java栈用数组实现好还是用链表实现好

java栈用数组实现好还是用链表实现好

Java17——用数组和链表实现栈

栈的基本知识

栈(stack) 是一种以 “后进先出” 的方式存放数据的数据结构,如图所示 。

而栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。

数组实现栈的操作

数组实现栈的操作,根据栈的特点,我们需要知道栈顶所在的位置,栈的默认长度,当前栈的长度这样几个基本的数据,然后去实现栈的基本操作。

  1. /**
  2. 基于数组实现的栈
  3. */
  4. class ArrayStack extends Stack{
  5. private static int DEFAULT_SIZE=10; //默认容量
  6. private int top; //栈顶指针
  7. private int[] data; //存储元素的容器
  8. //创建一个栈使用默认容量
  9. public ArrayStack(){
  10. this(DEFAULT_SIZE);
  11. }
  12. //创建一个栈使用用户指定容量capacity
  13. public ArrayStack(int capacity){
  14. super();
  15. this.top=-1;
  16. this.data=new int[capacity];
  17. }
  18. //入栈一个元素e
  19. public void push(int e){
  20. if(top==data.length-1){
  21. System.out.println("栈已满!无法入栈元素");
  22. }
  23. data[++top]=e;
  24. }
  25. //出栈一个元素
  26. public int pop(){
  27. if(isEmpty()){
  28. System.out.println("栈已空!无法出栈元素");
  29. return -1;//特殊含义 表示错误
  30. }
  31. return data[top--];
  32. }
  33. //判断栈是否为空
  34. public boolean isEmpty(){
  35. return this.top==-1;
  36. }
  37. //获取有效元素的个数
  38. public int length(){
  39. return this.top+1;
  40. }
  41. public String toString(){
  42. StringBuilder sb=new StringBuilder();
  43. sb.append('[');
  44. for(int i=0;i<=top;i++){
  45. sb.append(data[i]);
  46. if(i==top)
  47. return sb.append(']').toString();
  48. sb.append(',');
  49. sb.append(' ');
  50. }
  51. return "[]";
  52. }
  53. //获取当前栈的总容量
  54. public int getCapacity(){
  55. return data.length;
  56. }
  57. }

链表实现栈的操作 

相对于数组,使用链表的好处是不用预先设置容量,因为链表在内存中的地址可以是不连续的,存在零散的空间即可使用链表。所以说链表是一种动态的数据结构。

​ 链表由一系列节点节点组成,这些节点在内存中不必相连。每一个节点包含节点的元素以及该节点后继节点的链,我们称其为next链。不存在后继则将next设置为null。

​ 访问链表,需要找到该链表的头节点。初始化每个链表时,均会设置一个头节点head。head中包含元素以及链向后继元的next。通过next,可以访问到head的后继元节点。
 

  1. class LinkedStack extends Stack{//单向链表
  2. private Node head; //链表的头指针
  3. private int size; //链表的有效个数
  4. public LinkedStack(){
  5. this.head=new Node();
  6. this.size=0;
  7. }
  8. public LinkedStack(int[] arr){
  9. }
  10. public void push(int e){
  11. Node n=new Node();
  12. n.data=e;
  13. n.next=head.next;
  14. head.next=n;
  15. //head.next=new Node(e,head.next);
  16. size++;
  17. }
  18. public int pop(){
  19. if(isEmpty()){
  20. System.out.println("栈已空!不能出栈元素!");
  21. return -1;
  22. }
  23. Node n=head.next;
  24. head.next=n.next;
  25. n.next=null;
  26. size--;
  27. return n.data;
  28. }
  29. public int length(){
  30. return size;
  31. }
  32. public boolean isEmpty(){
  33. return size==0&&head.next==null;
  34. }
  35. public String toString(){
  36. if(isEmpty()){
  37. return "[]";
  38. }
  39. Node p=head.next;
  40. StringBuilder sb=new StringBuilder();
  41. sb.append('[');
  42. while(true){
  43. sb.append(p.data);
  44. if(p.next==null){
  45. sb.append(']');
  46. break;
  47. }else{
  48. sb.append(", ");
  49. p=p.next;
  50. }
  51. }
  52. return sb.toString();
  53. }
  54. //内部类:在类里面定义的类
  55. private class Node{
  56. int data; //数据域
  57. Node next;//指针域
  58. Node(){
  59. this(0,null);
  60. }
  61. Node(int data,Node next){
  62. this.data=data;
  63. this.next=next;
  64. }
  65. }
  66. }

 

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

闽ICP备14008679号