线性表——顺序表

线性表

线性表:n(n>=0)个数据元素组成的一个有限序列,可以在任意位置进行插入和删除操作的线性数据结构。

 

从数据在物理内存存储形式上线性表可分为:顺序表和链表

 

 从上图可以看出:

    线性表中数据与数据之间存在一对一的关系,即除第一个元素和最后一个元素外,每个元素都有唯一的直接前驱和唯一的直接后继,第一个元素没有前驱,最后一个元素没有后继

顺序表

顺序表:用一段地址连续的存储单元依次存储数据元素的线性结构。(地址连续的空间,一般情况下采用数组)

Java内存中,栈内存和堆内存占了很大一部分空间位置:栈内存的存储是连续的,堆内存的存储是离散的。

 

下面我们将完成基于静态数组的顺序表(默认数组元素为整型元素)的以下基本操作: 

1、置空表

2、判断线性表是否为空

3、求取线性表的长度

4、任意位置插入元素

5、获取指定位置的元素

6、删除并返回指定位置的元素

7、返回指定元素首次出现的位置,如不含该元素返回-1

8、输出该顺序表

顺序表的实现

Step1:设计线性表整型数据类型的java接口

复制代码
 1 package struct;
 2 
 3 //线性表的接口
 4 public interface LinearList {
 5 
 6     //置空表
 7     public void clear();
 8 
 9     //判断线性表是否为空
10     public boolean isEmpty();
11 
12     //求取线性表的长度
13     public int size();
14 
15     //任意index位置插入整型元素obj
16     public void insert(int index,int obj) throws Exception;
17 
18     //获取第index位置的元素
19     public int get(int index) throws Exception;
20 
21     //删除并返回第index个元素
22     public void delete(int index) throws Exception;
23 
24     //返回指定元素首次出现的位置,如不含该元素返回-1
25     public int indexOf(int obj);
26 
27     //输出该线性表
28     public void display();
29 
30 }
View Code
复制代码

 

然后让子类实现该接口即可。

Step2:设计顺序表类

复制代码
  1 package struct;
  2 
  3 public class ArrayList1 implements LinearList{
  4 
  5     //线性表存储空间(整型数组)
  6     private int[] listArray;
  7 
  8     //当前长度
  9     private int size;
 10 
 11     //顺序表构造函数,构造一个存储容量为maxSize的线性表
 12     public ArrayList1(int maxSize){
 13         //将顺序表当前长度置为0
 14         size = 0;
 15         //为顺序表分配maxSize个存储单元
 16         listArray= new int[maxSize];
 17     }
 18 
 19     //将一个已经存在的线性表置为空表
 20     public void clear(){
 21         size = 0;//将顺序表的当前长度置为0
 22     }
 23 
 24     //判断顺序表是否为空
 25     public boolean isEmpty() {
 26         return size==0;//若size=0则该表为空表,返回true
 27     }
 28 
 29     //求取线性表的长度
 30     public int size() {
 31         return size;//当前长度即为该线性表的长度
 32     }
 33 
 34     //获取表中第index个元素
 35     public int get(int index) throws Exception {
 36         if(index <0||index>size-1){
 37             //输如的index值不在该顺序表的范围内,抛出异常
 38             throw new Exception("第"+"【"+index+"】"+"个元素不存在");
 39         }else{
 40             //返回该元素
 41             return listArray[index];
 42         }
 43     }
 44 
 45     //任意位置插入元素obj
 46     public void insert(int index,int obj)throws Exception{
 47         if(size == listArray.length){
 48             //size达到设定该顺序表的最大长度,则表满,抛出异常
 49             throw new Exception("顺序表已经满了");
 50         }
 51         if(index < 0||index > size){
 52             //要插入的元素不在该顺序表的范围内,抛出异常
 53             throw new Exception("输入参数异常");
 54         }
 55         //移动元素
 56         else{
 57             for(int i = size-1;i>index;i--){
 58                 listArray[i+1]=listArray[i];
 59             }
 60             //不论当前顺序表size是否为0,此语句都可执行
 61             listArray[index] = obj;
 62             //改变顺序表的长度
 63             size++;
 64         }
 65     }
 66 
 67     //删除指定位置的元素
 68     public void delete(int index) throws Exception{
 69         if(isEmpty()){
 70             //判断是空表的情况
 71             throw new Exception("无法对空顺序表进行删除此操作");
 72         }
 73         if(index < 0 || index > size-1){
 74             //判断输入参数的合法性
 75             throw new Exception("输入参数错误");
 76         }else{
 77             for(int j = index;j<size;j++){
 78                 listArray[j] = listArray[j+1];
 79             }
 80         }
 81         //改变数组的大小
 82         size--;
 83     }
 84 
 85     //获取第一次出现指定元素的下标
 86     public int indexOf(int obj) {
 87         int k = 0;
 88         //while循环判断每个元素是否与指定的元素相等
 89         while(k<size&&!(listArray[k]==(obj))){
 90             k++;
 91         }
 92         if(k<size){
 93             return k;
 94         }else{
 95             return -1;
 96         }
 97     }
 98 
 99     //顺序表的输出
100     public void display(){
101         System.out.print("顺序表序列为:");
102         for(int x =0;x<size;x++){
103             System.out.print(listArray[x]+" ");
104         }
105         System.out.println();
106     }
107 
108 }
View Code
复制代码

 

Step3:测试类

复制代码
 1 package struct;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) throws Exception{
 6         ArrayList1 list = new ArrayList1(10);
 7         list.insert(0, 3);
 8         list.insert(1, 2);
 9         list.insert(2, 3);
10         list.insert(3, 2);
11         list.insert(4, 3);
12         list.insert(5, 2);
13         list.display();
14         int i = list.get(1);
15         System.out.println("要获取的指定元素为:"+i);
16         list.delete(1);
17         list.delete(4);
18         list.display();
19         int j = list.indexOf(2);
20         System.out.println("指定元素2第一次出现的下标为:"+j);
21         int k = list.size();
22         System.out.println("list的长度为:"+k);
23         list.clear();
24         int m = list.size();
25         System.out.println("清空后list的长度为:"+m);
26     }
27 
28 }
View Code
复制代码

 

运行结果如下图:

 

posted @   edda_huang  阅读(350)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示

目录导航