文章目录
线性表
线性表(linear list)是n个具有相同特征的数据元素的有限序列。线性表是一种在实际生活中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串…
顺序表
- 顺序表概念
顺序表是一段物理地址连续的储存单位依次储存数据数据元素的线性结构,一般情况下采用数组存储。在数组完成数据的增删改查。
个人理解:就是一个数组,但是可以进行一系列的操作,至于什么操作,可以
继续往下面看
- 顺序表的结构
一般可以分为:
静态顺序表:使用定长数组储存
动态顺序表:使用动态开辟的数据储存
- 顺序表的优点和缺点
优点:
- 能通过一个下标,快速找到想要查找的数据,时间复杂度为O(1)
缺点;
- 会浪费内存
- 每次扩容时,需要拷贝数据
- 删除和插入数据都需要移动数据
顺序表的实现
打印顺序表
//打印顺序表
public void display(){
for (int i =0;i<this.usedSize;i++){
System.out.println(this.elem[i]+" ");
}
}
在pos位置增添元素data
//判断顺序表是否满了
public boolean isFull(){
if(this.elem.length == this.usedSize){
return true;
}
return false;
}
/*在pos位置增添元素data
注意增添元素需要注意的是:1.pos的位置是否合法,就是是否超过这几个元素的范围
2.在元素增加后,移动位置时,不能将之前的元素覆盖
3.usedSize++
*/
public void add(int pos,int data){
if(this.isFull()){
this.elem = Arrays.copyOf(this.elem,2*this.elem.length); //扩容
}
if(pos<0||pos>this.usedSize){
System.out.println("pos位置不合法");
return;
}
for(int i =usedSize-1;i>=pos;i++){
this.elem[i+1] = this.elem[i];
}
this.elem[pos] =data;
usedSize++;
}
判断是否含有某个元素
//判断是否含有某个元素
public boolean contains(int toFind){
for(int i =0;i<this.usedSize;i++){
if(this.elem[i] == toFind){
return true;
}
}
return false;
}
获取pos位置的元素
//获取pos位置的元素
public int getPos(int pos){
if(pos<0 || pos >= usedSize){
return -1;
}
return this.elem[pos];
}
查找某个元素对应的位置
//查找某个元素对应的位置
public int search(int toFind){
for(int i =0;i< this.usedSize;i++){
if(this.elem[i]==toFind){
return i;
}
}
return -1;
}
给pos位置的元素改为value
//给pos位置的元素改为value
public void setPos(int pos, int value){
if(pos<0||pos>=this.usedSize){
System.out.println("pos位置不合法");
return;
}
this.elem[pos]=value;
}
删除第一次出现的关键词key:
/*
删除第一次出现的关键词key:
1.找到要删除元素位置为index
2.让 [i]=[i+1]
3.usedSize--
*/
public void remove(int key){
int index = this.search(key);
if(index==-1){
System.out.println("没有key");
return;
}
for(int i=0;i<this.usedSize-1;i++){
this.elem[i] = this.elem[i+1];
}
usedSize--;
}
清空顺序表
//清空顺序表
public void clear(){
this.usedSize=0;
}
}
完整代码
import java.util.Arrays;
public class List {
public int[] elem;
public int usedSize;
public List(){
this.elem = new int[5];
}
//打印顺序表
public void display(){
for (int i =0;i<this.usedSize;i++){
System.out.println(this.elem[i]+" ");
}
}
//判断顺序表是否满了
public boolean isFull(){
if(this.elem.length == this.usedSize){
return true;
}
return false;
}
/*在pos位置增添元素data
注意增添元素需要注意的是:1.pos的位置是否合法,就是是否超过这几个元素的范围
2.在元素增加后,移动位置时,不能将之前的元素覆盖
3.usedSize++
*/
public void add(int pos,int data){
if(this.isFull()){
this.elem = Arrays.copyOf(this.elem,2*this.elem.length); //扩容
}
if(pos<0||pos>this.usedSize){
System.out.println("pos位置不合法");
return;
}
for(int i =usedSize-1;i>=pos;i++){
this.elem[i+1] = this.elem[i];
}
this.elem[pos] =data;
usedSize++;
}
//判断是否含有某个元素
public boolean contains(int toFind){
for(int i =0;i<this.usedSize;i++){
if(this.elem[i] == toFind){
return true;
}
}
return false;
}
//获取pos位置的元素
public int getPos(int pos){
if(pos<0 || pos >= usedSize){
return -1;
}
return this.elem[pos];
}
//查找某个元素对应的位置
public int search(int toFind){
for(int i =0;i< this.usedSize;i++){
if(this.elem[i]==toFind){
return i;
}
}
return -1;
}
//给pos位置的元素改为value
public void setPos(int pos, int value){
if(pos<0||pos>=this.usedSize){
System.out.println("pos位置不合法");
return;
}
this.elem[pos]=value;
}
/*
删除第一次出现的关键词key:
1.找到要删除元素位置为index
2.让 [i]=[i+1]
3.usedSize--
*/
public void remove(int key){
int index = this.search(key);
if(index==-1){
System.out.println("没有key");
return;
}
for(int i=0;i<this.usedSize-1;i++){
this.elem[i] = this.elem[i+1];
}
usedSize--;
}
//清空顺序表
public void clear(){
this.usedSize=0;
}
}