顺序表概念:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
思路分析:
顺序表相对比较简单,操作也相对容易,即就是在数组上进行对应的增、删、查、改,稍加画图就很容易理解。
在实现代码内容前首先需要一个总体的实现框架,如下:
public class SeqList {
// 打印顺序表
public void display() {
}
// 新增元素,默认在数组最后新增
public void add(int data) {
}
// 在 pos 位置新增元素
public void add(int pos, int data) {
}
// 判定是否包含某个元素
public boolean contains(int toFind) {
return true;
}
// 查找某个元素对应的位置
public int indexOf(int toFind) {
return -1;
}
// 获取 pos 位置的元素
public int get(int pos) {
return -1;
}
// 给 pos 位置的元素设为 value
public void set(int pos, int value) {
}
//删除第一次出现的关键字key
public void remove(int toRemove) {
}
// 获取顺序表长度
public int size() {
return 0;
}
// 清空顺序表
public void clear() {
}
}
我们依次实现。
用于控制之后代码中相应的数据
public class SeqList {
private int []array ; //定义一个数组
private int usedSized = 0; //定义记录数组元素个数
//初始先给10个大小的空间
public static final int MaxSize = 10;
public SeqList(){
this.array = new int[MaxSize];
}
}
在这里可以先实现获取元素长度的方法,便于之后使用。
public int size() {
return usedSized;
}
// 打印顺序表
public void display() {
for (int j = 0; j < this.usedSized; j++) {
System.out.print(this.array[j] + " ");
}
System.out.println();
}
注:
新增元素不论元素位置插入在哪都要有以下思考。
1.判断是否元素已经放满。
2.若不是最后插入,要判断是否插入位置合法。
这里可以实现一个判断是否数组已满的方法
public boolean isFull(){
if(size() >= this.array.length){
return true;
}
else{
return false;
}
}
在数组尾部插入
//注:这里不要忘记要在主类外实现引用。
import java.util.Arrays;
public void add(int data) {
//1.首先要判断数组是否已满,若满了就要扩容
if(isFull()){
//这里可以利用Arrays包中的拷贝方法将数组扩大2倍
this.array = Arrays.copyOf(this.array,2*this.array.length);
}
//2.直接增加元素
this.array[this.usedSized] = data;
//元素长度加 1 。
usedSized++;
}
在数组任意位置插入。
// 在 pos 位置新增元素
public void add(int pos, int data) {
//1.同理,判断数组元素是否已满
if(isFull()){
this.array = Arrays.copyOf(this.array,2*this.array.length);
}
//2.要判断要插入的位置是否合法,不合法就要报错
//这里的报错,可以自己用代码修改。
if(pos < 0 || pos >size()){
System.out.println("pos位置不合法");
throw new PosWrongfulException("pos位置不合法");
}
//3.判断插入位置合法后加入元素
for (int i = size()-1; i <= pos ; i--) {
this.array[i+1] = this.array[i];
}
this.array[pos] = data;
}
在上述代码中,报错进行了修改,目的是不让程序因为异常出错进行了重写。
//重新实现一个类
public class PosWrongfulException extends RuntimeException{
public PosWrongfulException(String message) {
super(message);
}
}
// 判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < size(); i++) {
if(this.array[i] == toFind){
return true;
}
}
return false;
}
// 获取 pos 位置的元素
public int get(int pos) {
//1.首先判断pos位置元素是否合法
if(pos < 0 || pos > size()){
System.out.println("pos位置不合法");
throw new PosWrongfulException("pos位置不合法");
}
//2.判断数组是否为空
if(size() == 0){
System.out.println("数组为空无法获取");
throw new EmptyException("数组为空无法获取");
}
//获取位置
return this.array[pos];
}
// 给 pos 位置的元素设为 value
public void set(int pos, int value) {
//与上方获取pos方式同理
//1.判空
if(size() == 0){
System.out.println("数组为空无法获取");
throw new EmptyException("数组为空无法获取");
}
//2.判合法
if(pos < 0 || pos > size()){
System.out.println("pos位置不合法");
throw new PosWrongfulException("pos位置不合法");
}
//3.设值
this.array[pos] = value;
}
//给一个元素查找方法便于运用
public int toFind(int find){
for (int i = 0; i < size(); i++) {
if(array[i] == find){
return i;
}
}
return -1;
}
//删除第一次出现的关键字key
public void remove(int key) {
//1.要删除元素,先判断顺序表是否为空
if(toFind(key) == -1){
System.out.println("数组为空无法获取");
throw new EmptyException("数组为空无法获取");
}
//2.查找
for (int i = toFind(key); i < size()-1; i++) {
array[i] = array[i+1];
}
this.usedSized--;
}
// 清空顺序表
public void clear() {
this.usedSized = 0;
}