【数据结构】线性表之顺序表

线性表作为基础数据结构,分为顺序表和链表。本文重点探讨顺序表,它采用连续存储,逻辑相邻的元素物理位置也相邻。顺序表存储密度高,但预分配可能导致空间浪费,且插入删除操作效率较低,需要移动大量元素。文章通过接口和类描述,阐述顺序表的概念和操作。

线性表是一种最常见、最简单,也是一种最基本的数据结构,它是学习其他数据结构的基础。线性表有两种存储结构:顺序表和链表。下面我主要介绍顺序表。

所谓顺序表,就是顺序存储的线性表。顺序存储是用一组地址连续的存储单元一次存放线性表中各个数据元素的存储结构。顺序表基本使用数组来实现。

顺序表的特点:

  1. 在线性表中逻辑上相邻的数据元素,在物理存储位置上也是相邻的
  2. 存储密度高,但需要预先分配“足够应用”的存储单位,可能会造成存储空间的浪费
  3. 便于随机存放
  4. 不利于插入和删除操作,因为在顺序表上进行插入和删除操作会引起大量数据元素的移动

下面是线性表接口的描述:

package sequenceTable;
public interface IList {
	public void clear();
	public boolean isEmpty();
	public int length();
	public Object get(int i) throws Exception;
	public void insert(int i,Object x) throws Exception;
	public void remove(int i) throws Exception;
	public int indexOf(Object x);
	public void diaplay();
}

下面是顺序表类的描述:

package sequenceTable;
public class SqList implements IList {
	private Object[] listElem;
	private int curLen;
	public SqList(int maxSize) {
		curLen=0;
		listElem=new Object[maxSize];
	}

	@Override
	//将一个已经存在的线性表置成空表
	public void clear() {
		// TODO Auto-generated method stub
		curLen=0;
	}

	@Override
	//判断线性表是否为空
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return curLen==0;
	}

	@Override
	//判断线性表的长度
	public int length() {
		// TODO Auto-generated method stub
		return curLen;
	}

	@Override
	//读取线性表的第i个元素并返回其值
	public Object get(int i) throws Exception {
		// TODO Auto-generated method stub
		if(i<0 || i>curLen-1)  //i小于0或者大于表长减1
			throw new Exception("第"+i+"个元素不存在");
		
		return listElem[i-1];
	}

	@Override
	//在线性表的第i个元素之前插入一个值为x的数据元素
	public void insert(int i, Object x) throws Exception{
		// TODO Auto-generated method stub
		if(curLen==listElem.length) 
			throw new Exception("顺序表已满");
			
		if(i<0 || i>curLen)
			throw new Exception("插入位置不合法");
		for(int j=curLen;j>i;j--)  
			listElem[j]=listElem[j-1];   //插入位置及其之后的所有数据元素后移一位
		listElem[i]=x;  //插入x
		curLen++;  //表长+1
	}

	@Override
	//删除并返回线性表的第i个数据元素
	public void remove(int i) throws Exception{
		// TODO Auto-generated method stub
		if(i<0 || i>curLen-1)
			throw new Exception("删除位置不合法");
		for(int j=i;j>curLen-1;j++)  
			listElem[j]=listElem[j+1];   //删除位置之后的所有数据元素左移一位
		curLen--;  //表长减1
	}

	@Override
	//返回线性表中首次出现指定元素的位序号
	public int indexOf(Object x) {
		// TODO Auto-generated method stub
		int j=0;
		while(j<curLen && !listElem[j].equals(x))
			j++;
		if(j<curLen)
			return j;
		else
			return -1;
	}

	@Override
	//输出线性表中的元素
	public void diaplay() {
		// TODO Auto-generated method stub
		for(int j=0;j<curLen;j++) {
			System.out.println(listElem[j]+" ");
		}
		System.out.println(); //换行
	}
}

测试类:

package sequenceTable;
import java.util.Scanner;
public class SqListTest {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//建立一个顺序表('a','b','c','d','a','e','f'),查找顺序表中第一次出现字母a的位置,并查找第i个元素的直接前驱
		SqList L=new SqList(15);  //创建存储单位为10的空顺序表
		L.insert(0,'a');  //初始化前6个数据元素
		L.insert(1,'b');
		L.insert(2,'c');
		L.insert(3,'d');
		L.insert(4,'a');
		L.insert(5,'e');
		L.insert(6,'f');
		int order=L.indexOf('a');  //在顺序表中查找值为a的数据元素
		if(order!=-1)
			System.out.println("顺序表中第一次出现元素a的位置是:"+order);
		else 
			System.out.println("此顺序表中不包含值为a的数据元素");
		
		System.out.println("请输入想要查找第几个元素的直接前驱:");
		int i=new Scanner(System.in).nextInt();
		if(i>0 && i<=L.length())
			System.out.println("第"+i+"个元素的前驱元素是:"+L.get(i-1));
		else
			System.out.println("第"+i+"个元素的前驱元素不存在");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值