下面这个代码是一开始就定义好的数组大小,现在说一下我的顺序表的大概思想吧。
增
增也就是要对组数进行插入操作,插入又分为三种情况,头插,尾插和指定下标的插入;其实也可以直接看成一种情况,那就是指定位置插入,头插也就是把位置设定成第0个元素,尾插就是把把位置设定成size所在的地方,下面我对三种情况具体分析。
头插:首先要判断数组是否已满,如果数组已满则要给反馈一个信息给用户,提示数组已经满了。如果没满找到size的位置,将前一个的值一个一个移到后一个上去,将最前面的位置空下来,把值插入进去,然后size加一。
尾插:也要判断数组是否已满,如果数组已满则要给反馈一个信息给用户,提示数组已经满了。如果没满找到size的位置,将值插入到size所在位置上,然后size加一。
指定位置插入:也同样要判断数组是否已满,如果数组已满则要给反馈一个信息给用户,提示数组已经满了。如果没满再判断size的是否为0,如果size为0并且指定插入的位置也为零的话,那么就将值直接插入,size加一,接着判断要插入的位置是否在1到size之间,是否找到size的位置,定义一个临时变量i,让其开始等于size的值,从后往前移动,将前一个的值一个一个移到后一个上去,移动一个,i减一,直到i到达指定位置,将值插入进去,最后size加一。
删
删和插入一样也分成三种,头删,尾删和指定位置删除。也同样可以看成是一种指定位置删除,下面我就只详细的说一下指定位置的删除。
指定位置index的删除:首先判断index的值是否大于0并且小于size,如果不是,抛出一个异常告诉用户index值不合法;如果满足要求,那么定义一个临时变量i,让i的值等于index,将i的下一个的值赋给i,也就是前移,直到i的值等于size的前一个的值,然后size减一,删除操作完成。
查
查就是在顺序表中查找有没有指定的element值,如果有就返回该下标(这个代码是返回所有出现element值的下标)。首先判断顺序表是否为空,即size是否为0。如果size==0;直接返回,告诉用户该顺序表为空;如果size != 0,那么就定义一个临时变量从前往后找,如果找到element,就将下标输出,继续下一次查找,直到i的值为size,结束查找;如果该顺序表中没有element值就提示用户,该顺序表中不存在element值。我在下面查找的代码中用了一个临时变量index来记录是否出现过element,如果出现指定的element,那么index的值会小于size的值,否则index的值会等于size。
改
对于修改的话,其实很简单,顺序表不为空的情况下,只需要先判断要修改的下标是否是大于0,并且小于size的,如果是就直接将值放入到指定的下标即可。
public class MyArrayList {
private int[] array;
private int size; //记录顺序表中已有的个数
//构造方法
public MyArrayList() {
//1.申请空间
array = new int[20];
//2.初始化个数
size = 0;
}
//增加
//1.尾插
public void pushBack(int element){
if(size < array.length && size >=0){
array[size] = element;
size++;
}else{
throw new UnsupportedOperationException("顺序表已满!");
}
}
//2.头插
public void pushFront(int element){
if(size < array.length){
for (int i = size - 1; i >= 0 ; i--) {
array[i + 1] = array[i];
}
array[0] = element;
size++;
}else if(size == 0){
array[size] = element;
size++;
}else{
throw new UnsupportedOperationException("顺序表已满!");
}
}
//3.插入到指定index下标的元素
public void insert(int index,int element){ //index为下标
if(size == 0 && index == size){
array[index] = element;
size++;
}else if (size < array.length && size >= 1){
if(index < size && index >= 0 ){
for(int i = size;i>index;i--){
array[i] = array[i-1];
}
array[index] = element;
size++;
}else{
throw new UnsupportedOperationException("index为不合法下标!");
}
}else{
throw new UnsupportedOperationException("顺序表已满!");
}
}
//删除
//1.尾删
public void popBack(){
if(size <= 0){
throw new UnsupportedOperationException("当前顺序表为空!");
}else{
size--; //为了获取下标
array[size] = 0;
}
}
//2.头删
public void popFront(){
if(size <= 0){
throw new UnsupportedOperationException("当前顺序表为空!");
}else {
for (int i = 1; i < size; i++) {
array[i - 1] = array[i];
}
size--;
}
}
//3.删除指定index下标的元素
public void popinsert(int index){
if (index < 0 || index >= size){
throw new UnsupportedOperationException("index值不合法!");
}else {
for (int i = index; i < size - 1; i++) {
array[i] = array[i + 1];
}
size--;
}
}
//查(查找出所有值为element的下标)
public void Find(int element){
int index = 0;
int i = 0;
while ( i < size) {
if (array[i] == element){
System.out.println(i + " ");
i++;
}else{
index++;
}
}
if (index==size){
System.out.println("顺序表中不存在element值");
}
}
//改
public void Alter(int index,int element){
if(size!=0){
if(index < 0 || index >= size){
throw new UnsupportedOperationException("index下标不合法!");
}else{
array[index] = element;
}
}else{
throw new UnsupportedOperationException("顺序表为空!");
}
}
//打印
public void print(){
System.out.println("打印顺序表:");
for (int i = 0; i < size ; i++) {
System.out.print(array[i] + " ");
}
}
//测试
public static void main(String[] args) {
}
}