数据结构和算法(3)-向量,列表与序列

序列( Sequence),就是依次排列的多个对象。两种典型的序列:向量( Vector)和列表( List)。

3.1 向量与数组

通过[0, n-1]之间的每一个整数,都可以直接访问到唯一的元素 e,而这个整数就等于 S 中位于 e 之前的元素个数⎯⎯在此,我们称之为该元素的秩( Rank)。

3.1.1 向量 ADT

操作方法 功能描述
getSize(): 报告向量中的元素数目
输入:无
输出:非负整数
isEmpty(): 判断向量是否为空
输入:无
输出:布尔量
getAtRank®: 若 0 ≤ r < getSize(),则返回秩为 r 的那个元素
否则,报错
输入:一个整数
输出:对象
replaceAtRank(r, e): 若 0 ≤ r < getSize(),则将秩为 r 的元素替换为 e,并返回原来的元素
否则,报错
输入:一个整数和一个对象
输出:对象
insertAtRank(r, e): 若 0 ≤ r ≤ getSize(),则将 e 插入向量中,作为秩为 r 的元素(原秩不小于 r 的元素顺次后移);并返回该元素
否则,报错
输入:一个整数和一个对象
输出:对象
removeAtRank®: 若 0 ≤ r < getSize(),则删除秩为 r 的那个元素并返回之(原秩大于 r 的元素顺次前移)
否则,报错
输入:一个整数
输出:对象

一种直截了当的方法就是采用数组来实现向量:下标为r的数组项,就对应于秩为r的元素。

3.1.2 基于数组的简单实现

    public class ExceptionBoundaryViolation extends RuntimeException {
    
    	public ExceptionBoundaryViolation(String message) {
    
    		super(message);
    	}
    }

向量接口:

public interface Vector {
    
	// 返回向量中元素数目
	public int getSize();
	// 判断向量是否为空
	public boolean isEmpty();
	/**查改增删*/
	// 取秩为r的元素
	public Object getAtRank(int r) throws ExceptionBoundaryViolation;
	// 将秩为r的元素替换为obj
	public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation;
	// 插入obj,作为秩为r的元素;返回该元素
	public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation;
	// 删除秩为r的元素
	public Object removeAtRank(int r) throws ExceptionBoundaryViolation;
}
/*
* 基于数组的向量实现
*/
public class Vector_ExtArray implements Vector {
    

	private int N = 8;// 数组的容量,可不断增加
	private int n;// 向量的实际规模
	private Object A[];// 对象数组

	public Vector_ExtArray() {
    
		A = new Object[N];
		n = 0;
	}

	@Override
	public int getSize() {
    
		// TODO Auto-generated method stub
		return n;
	}

	@Override
	public boolean isEmpty() {
    
		// TODO Auto-generated method stub
		return (0 == n) ? true : false;
	}

	@Override
	public Object getAtRank(int r) throws ExceptionBoundaryViolation {
    
		if (0 > r || r >= n)
			throw new ExceptionBoundaryViolation("意外:秩越界");
		return A[r];
	}

	@Override
	public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation {
    
		if (0 > r || r >= n)
			throw new ExceptionBoundaryViolation("意外:秩越界");
		/*
		 * A[r] = obj; return A[r];
		 */

		Object bak = A[r];
		A[r] = obj;
		return bak;
	}

	@Override
	public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation {
    
		if (0 > r || r > n)
			throw new ExceptionBoundaryViolation("意外:秩越界");
		if (N < n) {
    
			// 数组容量小于实际规模
			N *= 2;
			Object B[] = new Object[N];// 开辟一个容量加倍的数组
			for (int i = 0; i < n; i++) {
    
				B[i] = A[i];
			}
			A = B;// 用B替换A(原A[]将被自动回收)
		}
		for (int i = n; i > r; i--)
			A[i] = A[i - 1];// 后续元素顺次后移
		A[r] = obj;// 插入
		n++;// 更新当前规模
		return obj;
	}

	@Override
	public Object removeAtRank(int r) throws ExceptionBoundaryViolation {
    
		if (0 > r || r >= n)
			throw new ExceptionBoundaryViolation("意外:秩越界");
		Object bak = A[r];
		for (int i = r; i 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值