目录
2.1public boolean add(int pos, Object data)//在pos位置插入data
2.2public int search(int key)//查找关键字key位置的数组下标
2. 3 public boolean contains(Object key)//判断是否包含关键词key是否在顺序表当中
2.4 public Object getPos(int pos) //得到pos的值
2.5 public Object remove(Object key) //删除第一次出现的关键字key
2.6 public int size() //得到顺序表的长度
2.7 public void display() //打印顺序表
线性表
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物
理上存储时,通常以数组和链式结构的形式存储。
eg.常见的线性表:顺序表、链表、栈、队列、字符串
顺序表
一段物理地址连续的存储单元依次存储数据元素的线性结构
创建MySequenceImpl类实现ISequence接口
顺序表接口:
package b.DS.link;
public interface ISequence {
//在pos位置插入data
boolean add(int pos,Object data);
//查找关键词key 找到返回数组下标 没有返回-1
int search(Object key);
//判断是否包含关键词key是否在顺序表当中
boolean contains(Object key);
//得到pos的值
Object getPos(int pos);t
//删除第一次出现的关键字key
Object remove(Object key);
//得到顺序表的长度
int size();
//打印顺序表
void display();
}
1属性
a.数组:数组名为elem,数据类型为Object
private Object[] elem;
b.有效数据长度:名称为Usedsize,数据类型为int类型
private int usedSize;
c.定义数组容量大小为10
public static final int=DEFAULT_SIZE=10;
MySequenceImpl类的构造方法为属性初始化:
public MySequenceImpl() {//构造函数
this.elem = new Object[DEFAULT_SIZE];//对数组elem初始化
this.usedSize = 0;//数组长度的初始化
}
2方法
2.1public boolean add(int pos, Object data)//在pos位置插入data
核心思想:
1检查是否安全---不安全返回false
2检查数组是否为满-----为满返回false
3从usedSize-1位置向前遍历数组,pos位置时,前一个数赋值给后一个数,依次向后赋值,再将插入的数据data放入pos位置
代码:此处用到的数组扩容实质上是数组的浅拷贝(不会改变原数组对象)
private boolean isFull() {
return this.usedSize == this.elem.length;//有效长度等于数组长度------>满
}
@Override
//在pos位置插入data
public boolean add(int pos, Object data) {
//1.pos位置的合法性进行
if (pos < 0 || pos > this.usedSize) {//pos位置小于有效数组长度或者小于零-------不合法
return false;
}
//2.判断是否为满
if (isFull()) {
//扩容两倍
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);//ArraysOf()参数:原始数组,新的长度
}
for (int i = this.usedSize - 1; i >= pos; i--) {
this.elem[i + 1] = this.elem[i];//把i的值给i+1 一直到把pos的值给pos+1
}
this.elem[pos] = data;
this.usedSize++;//插入一个data后 有效数据长度+1
return true;
}
2.2public int search(int key)//查找关键字key位置的数组下标
思想:
1判断数组是否为空----返回-1
2遍历数组,用equals()方法,关键字key相同的值的地址,返回该数组下标(地址)
代码:
private boolean isEmpty() {//判断有效数组长度是否为0
return this.usedSize == 0;
}
@Override
//查找关键词key 找到返回数组下标 没有返回-1
public int search(Object key) {
if (isEmpty()) {
return -1;
}
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i].equals(key)) {//当数组elem里面的内容和关键字key 数值相等时
return i;//满足上述条件时 返回数组elem的下标
}
}
return -1;//没找到返回-1
}
2. 3 public boolean contains(Object key)//判断是否包含关键词key是否在顺序表当中
思想:遍历数组,关键字key相同的值的地址,返回true,否则返回false
@Override
//判断是否包含关键词key是否在顺序表当中
public boolean contains(Object key) {
if (isEmpty()) {
return false;
}
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i].equals(key)) {//当数组elem里面的内容和关键字key 数值相等时
return true;//满足上述条件时 返回true
}
}
return false;//没包含key返回false
}
2.4 public Object getPos(int pos) //得到pos的值
1检查合法性
2返回this.elem[pos]就是pos位置当前的值
@Override
//得到pos的值
public Object getPos(int pos) {
if (pos < 0 || pos >= this.usedSize){//pos位置小于有效数组长度或者小于零-------不合法
return null;
}
return this.elem[pos];//返回elem[pos]的值
}
2.5 public Object remove(Object key) //删除第一次出现的关键字key
思想:
1判断是否为空----空的话就返回null
2调用search函数找到key的数组下标index
3定义Object类型变量Olddata来记录删除位置index的值
4遍历数组,使得后一个数赋值给前一个数,迭代,使得被删除的结点被覆盖掉
@Override
//删除第一次出现的关键字key
public Object remove(Object key) {
int index=search(key);//调用search()方法->找到key->将key赋值给index
if(index==-1) {//如果没有关键词key----返回null
return null;
}
Object data=this.elem[index];//保存index位置的值
for(int i=index;i<usedSize-1;i++){//遍历顺序表->将某数的后一个数赋值给它本身
this.elem[i]=this.elem[i+1];
}
this.usedSize--;
return data;
}
2.6 public int size() //得到顺序表的长度
思想:也就是数组有效长度
@Override
public int size() {
return this.usedSize;//返回有效数组长度
}
2.7 public void display() //打印顺序表
思想:遍历顺序表打印
@Override
public void display() {
for(int i=0;i<UsedSize;i++){
System.out.print(this.elem[i]+"");
}
System.out.println(" ");
}
3完整代码:
import java.util.Arrays;
public class MySequenceImpl implements ISequence {
private Object[] elem;//定义数组elem[] 数组名elem 数据类型为Object
private int usedSize;//有效数据长度
private static final int DEFAULT_SIZE = 10;//定义数组初始容量大小
public MySequenceImpl() {//构造函数
this.elem = new Object[DEFAULT_SIZE];//对数组elem初始化
this.usedSize = 0;//数组长度的初始化
}
private boolean isFull() {
return this.usedSize == this.elem.length;//有效长度等于数组长度------>满
}
@Override
//在pos位置插入data
public boolean add(int pos, Object data) {
//1.pos位置的合法性进行
if (pos < 0 || pos > this.usedSize) {//pos位置小于有效数组长度或者小于零-------不合法
return false;
}
//2.判断是否为满
if (isFull()) {
//扩容两倍
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);//ArraysOf()参数:原始数组,新的长度
}
for (int i = this.usedSize - 1; i >= pos; i--) {
this.elem[i + 1] = this.elem[i];//把i的值给i+1 一直到把pos的值给pos+1
}
this.elem[pos] = data;
this.usedSize++;//插入一个data后 有效数据长度+1
return true;
}
private boolean isEmpty() {//判断有效数组长度是否为0
return this.usedSize == 0;
}
@Override
//查找关键词key 找到返回数组下标 没有返回-1
public int search(Object key) {
if (isEmpty()) {
return -1;
}
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i].equals(key)) {//当数组elem里面的内容和关键字key 数值相等时
return i;//满足上述条件时 返回数组elem的下标
}
}
return -1;//没找到返回-1
}
@Override
//判断是否包含关键词key是否在顺序表当中
public boolean contains(Object key) {
if (isEmpty()) {
return false;
}
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i].equals(key)) {//当数组elem里面的内容和关键字key 数值相等时
return true;//满足上述条件时 返回true
}
}
return false;//没包含key返回false
}
@Override
//得到pos的值
public Object getPos(int pos) {
if (pos < 0 || pos >= this.usedSize){//pos位置小于有效数组长度或者小于零-------不合法
return null;
}
return this.elem[pos];//返回elem[pos]的值
}
@Override
//删除第一次出现的关键字key
public Object remove(Object key) {
int index=search(key);//调用search()方法->找到key->将key赋值给index
if(index==-1) {//如果没有关键词key----返回null
return null;
}
Object data=this.elem[index];//保存index位置的值
for(int i=index;i<usedSize-1;i++){//遍历顺序表->将某数的后一个数赋值给它本身
this.elem[i]=this.elem[i+1];
}
this.usedSize--;
return data;
}
@Override
//得到顺序表的长度
public int size() {
return this.usedSize;//返回有效数组长度
}
@Override
//打印顺序表
public void display() {
for(int i=0;i<usedSize;i++){//遍历顺序表
System.out.print(this.elem[i]+" ");
}
System.out.println("");
}
}
调用:
public class Test1 {
public static void main(String[] args) {
MySequenceImpl mySequence=new MySequenceImpl();
for(int i=0;i<20;i++){
mySequence.add(i,i*2);//插入长度为20的数组 数组下标i elem[i]=i*2
}
System.out.println("打印此顺序表:");
mySequence.display();
System.out.println( "此顺序表的长度:"+mySequence.size());//返回顺序表长度
System.out.println("关键词10是否在顺序表当中:"+mySequence.contains(10));
System.out.println( "查找关键词38(找到返回数组下标 没有返回-1):"+mySequence.search(38));
Object res1=mySequence.getPos(1);
System.out.println("pos为1时 elem[1]的值:"+res1);
Object res2=mySequence.remove(8);//删除关键字为8
System.out.println("删除的值(key):"+res2);
System.out.println("打印执行删除操作后的顺序表:");
mySequence.display();
}
}
运行结果: