数据结构- 顺序表

顺序表 是以数组的形式 顺序存储 线性表的结构。

具有线性表的基本特点:1)头结点:第一个结点没有前继元素 。2)尾结点:最后一个结点没有后继元素 3)其他数据元素有且仅有一个 前驱 和 一个后驱 结点。

顺序表独有的特点:n 为长度 , 指定元素位置 i

1)以数组形式实现顺序表, 每个结点放一个元素。

2)插入元素需要向后移动的次数是 : n - i + 1

3)删除元素需要向前移动的次数是 : n - i

4)查询访问不同位置的内存地址都可以通过公式 计算,因此 查询访问快速。

顺序表 API的设计

【设计】

  1. //清空线性表
  2. public void clear();
  3. //返回线性表的长度
  4. public int getLength();
  5. //添加元素到线性表尾部
  6. public void add(T data);
  7. //添加元素到线性表指定位置
  8. public void add(T data , int index);
  9. //移除元素表指定下标的元素
  10. public void remove(int index);
  11. //获取指定位置的元素
  12. public T get(int index);
  13. //扩充线性表的容量
  14. public T[] resize(int newSize);

成员变量:1.引用类型数组 2.元素个数和长度 length
成员方法:

  • 1.清空顺序表

  • 2.添加元素

  • 3.添加元素到指定位置前

  • 4.移除元素

  • 5.获取指定位置的元素

  • 6.修改替换指定位置的元素

  • 7.重写toString展示顺序表内容

  • 8.判断线性表是否为空

  • 9.获取线性表的长度

  • 10.扩容顺序表
    【算法实现思路】
    1.clear() 清空顺序表 -> 删除所有元素 -> 返回一个新数组,长度为0
    2.add()添加新元素 -> 方法接收新元素 -> 新元素赋值到数组 -> arr[n] = data;
    3.add(index)添加元素到指定下标 ->
    方法名(目标下标位置,元素值) {
    //想法1:延长顺序表长度(煞笔思维,因为是数组怎么可能拓展长度,不要脱离本质)
    //想法2:第一步:从后往前循环 【int i = 数组长度-1 ; i > index ; 向后移动 arr[i] = arr[i-1] , 执行完成 i —】;
    //第二步:执行 arr[目标下标] = 元素值
    //后续考虑:数组越界的异常处理
    }
    4.remove()移除指定下标的元素(int index){
    //找出目标下标 与 下标后向左移动的次数 .得出循环条件 i = index , i < count -1 ; i++
    //arr[目标下标] = arr[i]+1
    //再将a[i+1]原有元素清空 = null
    }
    5.get()获取 指定位置 的元素。 return ele数组[index] 即可
    6.toString()@Override 重写-> 遍历数组 ,将数组的内容 添加到 String 变量去,然后sout 即可
    7..isEmpty()判断线性表是否为空 -> 如果元素个数n 为0 则返回 true , 否则返回 false
    8..getLength()获取线性表的长度 -> return ele.length 即可
    9.isFull() 顺序表内容是否 已满 -> return count == ele.length; 即可
    10.reSize(int newSize) 顺序表已满时,则扩容 .即将 新建一个[] newSize ,且将旧的数据接到新的数组中

  1. package 线性结构_顺序存储.线性表;
  2. /**
  3. * @author Tommy
  4. * @version 1.0
  5. * @desc
  6. * @ClassName SequenceList
  7. * @date 2022/6/23/14:16
  8. **/
  9. public class SequenceList<T> {
  10. private T[] ele ; //存储元素的数组
  11. private int count ; //记录元素个数
  12. SequenceList(int capacity){
  13. this.ele =(T[])new Object[capacity];
  14. }
  15. /**
  16. * 判断顺序表是否为空
  17. * @return
  18. */
  19. public boolean isEmpty(){
  20. return count == 0;
  21. }
  22. /**
  23. * 判断顺序表队列位置是否已满
  24. */
  25. public boolean isFull(){
  26. return count==getLength();
  27. }
  28. /**
  29. * 返回顺序表的 长度
  30. * @return
  31. */
  32. public int getLength(){
  33. return ele.length;
  34. }
  35. /**
  36. * 将线性表清空重置
  37. */
  38. public void clear(){
  39. this.count = 0;
  40. }
  41. /**
  42. * 把 data 数据元素 添加到顺序表
  43. * @param data
  44. */
  45. public void add(T data){
  46. ele[count] = data;
  47. count++;
  48. }
  49. /**
  50. * 将data元素 添加到顺序表的指定索引下标位置处
  51. * @param data
  52. * @param index
  53. */
  54. public void add(T data,int index) {
  55. if (isFull()) {
  56. resize(10);
  57. }
  58. for (int i = count ; i > index; i--) {
  59. ele[i] = ele[i - 1];
  60. }
  61. ele[index] = data;
  62. }
  63. /**
  64. * 移除顺序表下标位置中的元素
  65. * @param index
  66. */
  67. public void remove(int index){
  68. for (int i = index; i < count-1; i++) {
  69. ele[i] = ele[i+1];
  70. ele[i+1] = null; //将原有元素赋0;
  71. }
  72. }
  73. public T get(int index){
  74. return ele[index];
  75. }
  76. @Override
  77. public String toString() {
  78. String result = "";
  79. for (int i = 0; i < getLength(); i++) {
  80. result = ele[i] +" ";
  81. System.out.print(result);
  82. }
  83. return result;
  84. }
  85. //根据参数newSize,扩容
  86. public void resize(int newSize){
  87. //定义一个临时数组,指向原数组
  88. T[] temp=ele;
  89. //创建新数组
  90. ele=(T[])new Object[newSize];
  91. //把原数组的数据拷贝到新数组即可
  92. for(int i=0;i<count;i++){
  93. ele[i]=temp[i];
  94. }
  95. }
  96. }