大佬教程收集整理的这篇文章主要介绍了Java之顺序表【五千字肝爆,零基础保姆集教程不会你打我】,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
什么是线性表?
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构c;常 见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构c;也就说是连续的一条直线。 但是在物理结构上并不一定是连续的c;线性表在物理上存 储时c;通常以数组和链式结构的形式存储。
@H_262_75@
就比如这样。 那我们再想c;顺序表既然是顺序存放的c;那么它和谁的结构相像呢?顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构c;一般情况下采用数组存储。在数组上完成数据的增删查改。 顾名思义c;顺序表它里面的数是按顺序存放的c;不能是随意存放亦或者是间隔存放
数组
顺序表的底层就是数组
顺序表一般可以分为:
而我们要注意的是:
静态顺序表适用于确定知道需要存多少数据的场景. 静态顺序表的定长数组导致N定大了c;空间开多了浪费c;开少了不够用. 相比之下动态顺序表更灵活, 根据需要动态的分配空间大小.
那么问题又来了:既然顺序表底层是数组c;那为什么不直接使用数组??why??
我们来画一个图: 请问这个数组里面有多少有效数据??可能你会说:等于0的时候就跳出来嘛 count计数一下!!! 这样是不可行的:
那如果0也是数据呢?对吧c;这样就会有问题。那么我们可以定义一个变量:这个变量叫做 useSide (代表当前里面有多少有效数据)
这里代表里面有4个数据:
所以我们就会认识到: 一个顺序表不只一个数组就可以实现c;还需要其他的变量(比如(usedSize)首先我们发现这个对象就是一个 顺序表c;里面有数组和 有效数组 变量和一个数组容量:
看一些main里面实例化对象在内存的一个布局:根据上面的理解c;我们知道了实现顺序表需要的三个因素:
public class @H_68_175@myArrayList {
public int[] elem; //数组
public int useSize; //有效数组
public static int capacity = 10; //可用容量
public @H_68_175@myArrayList() { //使用构造方法 初始容量
this.elem = new int[capacity];
}
}
构造函数的相关知识可以去看我写的另一篇博客: 带你一分钟理解构造函数
// 打印顺序表
public void display() { }
// 在 pos 位置新增元素
public void add(int pos, int data) { }
// 判定是否包含某个元素
public Boolean contains(int toFind) { return true; }
// 查找某个元素对应的位置
public int search(int toFind) { return -1; }
// 获取 pos 位置的元素
public int getPos(int pos) { return -1; }
// 给 pos 位置的元素设为 value
public void setPos(int pos, int value) { }
//删除第一次出现的关键字key
public void remove(int toRemove) { }
// 获取顺序表长度
public int size() { return 0; }
// 清空顺序表
public void clear() { }
是不是感觉头皮发麻?
别慌c;我们一起来一个一个看
思路:遍历数组即可
注意遍历的长度是useSize(打印有效的数字)
// 打印顺序表
public void display() {
for (int i = 0; i < this.useSize; i++) {
System.out.print(elem[i] + " ");
}
System.out.println();
}
给定指定的位置放入指定的数据:
public void add(int pos,int data){
}
我们需要在顺序表中执行add函数c;以执行在pos位置添加data数据的功能。
接下来需要谈谈细节:
我们来看一下图片解析:
1c;2c;3c;4c;5顺序存放c;我们要在3的位置插入元素c;那我们只需将3c;4c;5都向后移一个位置即可。让我们一起来看一下代码:
public Boolean isFull() {
/*if(thiS.UsedSize == capacity) {
return true;
}
return false;*////两种方法
return this.usedSize == capacity;//判断useSize和最大容量一样吗 一样就满了
}
public void add(int pos, int data) {
//1、pos的合法情况
if(pos < 0 || pos > this.usedSize) {
System.out.println("pos位置不合法!");
return;
}
//2、满的情况
if(isFull()) {
//扩容
this.elem = Arrays.copyOf(this.elem,2*capacity);
capacity *= 2;//新的容量
}
for(int i = this.usedSize-1; i >= pos;i--) {
this.elem[i+1] = this.elem[i];
}
this.elem[pos] = data;
this.usedSize++;
}
思路:
- 遍历的长度为:useSize
- 遍历数组c;看看哪个元素在判断时等于toFind(需要判断的元素)
//判断数组是否为空(有效数据是否为0)
public Boolean isEmpty() {
return this.usedSize == 0;
}
public Boolean contains(int toFind) {
if(isEmpty()) return false;
for (int i = 0; i < this.usedSize; i++) {
if(this.elem[i] == toFind) {
return true;
}
}
return false;
}
思路:
- 遍历数组即可c;找到返回下标
- 注意数组的遍历长度为useSize
public Boolean isEmpty() {
return this.usedSize == 0;
}
public int search(int toFind) {
if(isEmpty()) return -1;
for (int i = 0; i < this.usedSize; i++) {
if(this.elem[i] == toFind) {
return i;
}
}
return -1;
}
思路: 直接返回pos下标的数组
public int getPos(int pos) {
if(isEmpty()) {
//return -1; 业务的处理
throw new RuntimeException("顺序表是空的");//手动抛出错误(异常)
}
if(pos < 0 || pos >= this.usedSize) {
throw new RuntimeException("pos不合法");//手动抛出错误(异常)
}
return this.elem[pos];
}
思路:直接返回useSize 即可
public int size() {
return this.usedSize;
}
public void setPos(int pos, int value) {
if(pos < 0 || pos >= this.usedSize) {
System.out.println("pos不合法!");
return;
}
if(isEmpty()) {
System.out.println("顺序表为空!");
return;
}
this.elem[pos] = value;
}
代码和add很像c;找到要删除的元素c;然后让第i+1个元素移到当前第i个的元素就可以了c;最后useSize–1.
图片解析:
public void remove(int toRemove) {
if(isEmpty()) return;
int index = search(toRemove);
if(index == -1) {
System.out.println("没有你要删除的数字");
return;
}
for (int i = index; i < this.usedSize-1; i++) {
this.elem[i] = this.elem[i+1];
}
this.usedSize--;
}
思路:让数组每个元素都为0(有效数据也为0)
public void clear() {
for (int i = 0; i < this.usedSize; i++) {
this.elem[i] = 0;
}
this.usedSize = 0;
}
以上是大佬教程为你收集整理的Java之顺序表【五千字肝爆,零基础保姆集教程不会你打我】全部内容,希望文章能够帮你解决Java之顺序表【五千字肝爆,零基础保姆集教程不会你打我】所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。