Java实现顺序表及常见操作

//顺序表类,实现ADT List<T>声明的方法,T表示数据元素的数据类型
public class SeqList<T> extends Object{
	//对象数组存储顺序表的数据元素,protected声明
	protected Object[] element ;
	//顺序表元素的个数(表长)
	protected int n ;
	
	//构造容量为length的空表
	public SeqList(int length){
		//申请数组的存储空间,元素为null
		this.element = new Object[length];
		//若length<0,则跑出负数组长度异常java.lang.NegativeArraySizeException
		this.n = 0 ;
	}
	
	//创建默认容量的空表,构造方法重载
	public SeqList(){
		//调用本类已经声明的指定参数列表的构造方法
		this(64) ;
	}
	
	//构造顺序表,由values数组提供元素
	public SeqList(T values[]){
		//创建容量为values.length的空表
		//若values==null,则用空对象调用方法,抛出NullPointerException异常
		this(values.length) ;
		//复制数组元素,T(n) = O(n)
		for(int i=0;i<values.length;i++){
			//对象引用赋值
			this.element[i] = values[i] ;
		}
		this.n = element.length ;
	}
	
	//判断顺序表是否为空,若为空则返回true
	public boolean isEmpty(){
		return this.n == 0 ;
	}
	
	//返回顺序表元素个数
	public int size(){
		return this.n ;
	}
	
	//返回第i个元素,0≤i≤n。若i越界,则返回null
	public T get(int i){
		if(i>=0 && i<this.n){
			//返回数组元素引用的对象,传递对象引用
			return (T)this.element[i] ;
		}
		else{
			return null ;
		}
	}
	
	//设置第i个元素为x,0≤i≤n。若i越界,则抛出序号越界异常;若x==null,则抛出空指针异常
	public void set(int i,T x){
		if(x == null){
			//抛出空指针异常
			throw new NullPointerException("x == null") ;
		}
		else if(i>=0 && i<this.n){
			this.element[i] = x ;
		}
		else{
			//抛出序号越界异常
			throw new java.lang.IndexOutOfBoundsException(i+"");
		}
	}
	
	//返回顺序表所有元素的描述字符串,形式为“(,)”,覆盖Objcet类的toString()方法
	public String toString(){
		//返回类型
		String str = this.getClass().getName()+"(" ;
		if(this.n>0){
			str += this.element[0].toString() ;
		}
		for(int i=1;i<this.n;i++){
			//执行T类的toString()方法,运行时多态
			str += "," +this.element[i].toString();
		}
		//空表返回()
		return str+")" ;
	}
	
	//插入x作为第i个元素,x!=null,返回x序号。若x==null,则抛出空对象异常。T(n)=O(n)。
	//对序号i采取容错措施,若i<0,则插入x在最前;若i>n,则插入x在最后
	public int insert(int i,T x){
		if(x == null){
			//抛出空指针异常
			throw new NullPointerException("x == null") ;
		}
		//插入位置i容错,插入在最前
		else if(i<0){
			i = 0 ;
		}
		//插入位置i容错,插入在最后
		else if(i>this.n){
			i = this.n ;
		}
		//数组引用赋值,source也引用element
		Object source[] = this.element ;
		//若数组空间已满,则扩充顺序表的数组容量
		if(this.n == element.length){
			//重新申请一个容量更大的数组
			this.element = new Object[source.length*2] ;
			//复制当前数组前i-1个元素
			for(int j=0;j<i;j++){
				this.element[j] = source[j];
			}
		}
		//从i开始至表尾的元素向后移动,次序从后向前
		for(int j=this.n-1;j>=i;j--){
			this.element[j+1] = source[j] ;
		}
		this.element[i] = x;
		this.n++ ;
		//返回x的序号
		return i ; 
	}
	
	//顺序表表位插入x元素,返回x序号。成员方法重载。插入操作中,this.n加1。
	public int insert(T x){
		return this.insert(this.n, x) ;
	}
	
	//删除第i个元素,0≤i≤n,返回被删除的元素。若i越界,则返回null
	public T remove(int i){
		if(this.n>0 && i>=0 && i<this.n){
			//old中存储被删除元素
			T old = (T)this.element[i] ;
			for(int j=i;j<this.n-1;j++){
				//元素前移一个位置
				this.element[j] = this.element[j+1] ;
			}
			//设置数组元素对象为空,释放原引用实例
			this.element[this.n-1] = null ;
			this.n--;
			//返回old局部变量引用的对象,传递对象引用
			return old ;
		}
		return null ;
	}
	
	//删除线性表所有元素
	public void clear(){
		//设置长度为0,未释放数组空间
		this.n = 0 ;
	}
	
	//顺序查找首次出现的与key相等的元素,返回元素序号i,0≤i≤n;查找不成功则返回-1
	//若key==null,则抛出空指针异常NullPointerException
	public int search(T key){
		for(int i=0;i<this.n;i++){
			//执行T类的equals()方法,运行时多态
			if(key.equals(this.element[i])){
				return i ;
			}
		}
		//空表或未找到时,返回-i
		return -1 ;
	}
	
	//判断是否包含关键字为key的元素
	public boolean contains(T key){
		return this.search(key)!=-1 ;
	}	
}

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
顺序表和链表是两种常见数据结构,它们都可以用来实现线性表,但是在实现上有所不同。 1. 顺序表的基本操作: - 初始化:创建一个定长的数组,用来存储数据。 - 插入:在指定位置上插入一个元素,需要将该位置及其后面的元素全部后移,时间复杂度为O(n)。 - 删除:删除指定位置上的元素,需要将该位置后面的元素全部前移,时间复杂度为O(n)。 - 查找:根据元素的值或者下标查找指定元素,时间复杂度为O(n)。 - 修改:修改指定位置上的元素,时间复杂度为O(1)。 2. 链表的基本操作: - 初始化:创建一个头节点,头节点不存储数据,用来标识链表的起始位置。 - 插入:在指定位置上插入一个元素,需要先找到该位置的前一个节点,然后将该节点的next指针指向新节点,新节点的next指针指向该节点后面的节点,时间复杂度为O(n)。 - 删除:删除指定位置上的元素,需要先找到该位置的前一个节点,然后将该节点的next指针指向该节点后面的节点,时间复杂度为O(n)。 - 查找:根据元素的值或者下标查找指定元素,需要从头节点开始遍历整个链表,时间复杂度为O(n)。 - 修改:修改指定位置上的元素,需要先找到该节点,然后修改该节点存储的数据,时间复杂度为O(n)。 总体而言,顺序表适用于频繁访问元素,而不频繁修改和删除的场景,链表适用于频繁修改和删除元素的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值