首先:小编在这里祝大家中秋快乐!!!
数据结构(顺序表)
大家好呀,小编我中秋节闲着是闲着(母胎solo)
就写了顺序表的增删改查
让我们趁着这次中秋佳节
一起学习顺序表叭~
顺序表的定义
什么是顺序表?
顺序表是0个或多个具有相同数据类型的数据元素的有限序列
是一段物理地址连续的存储单元依次存储元素的线性结构.
例子:顺序表, 链表., 栈, 队列
别看上面一堆专业术语,看下面的~.
讲人话就是通俗来讲
顺序表就是数组,
顺序表本质上是一种连续的数组
所以顺序表的特点就两个:
- 连续
- 数组
那我们怎么判断是否连续呢?
如图:
我们用一个int类型的整数计算表中的个数即可
顺序表的分类
- 静态顺序表:使用指定好长度的数组存储
- 动态顺序表: 使用动态数组存储的
顺序表的实现
1.新建一个顺序表
顺序表的初始化
第一步:
定义一个数组来存储顺序表
private int[] elem; //用这个数组来存储数据
第二步:
定义一个int类型的usedSize来计算表中的有效数据个数
private int usedSize; //用来计算表中的有效个数
第三步:
创建顺序表的无参构造方法
在无参构造方法中默认定义顺序表的个数是10个.
//无参构造方法中默认顺序表中为10个个数
public MyArrayList(){
this.elem = new int[10];
}
第四步:
创建有参构造方法
该方法可以自行指定创建多大的顺序表.
//有参构造方法中指定顺序表的个数为num个
public MyArrayList(int num){
this.elem = new int[num];
}
新建顺序表的完整代码如下:
public class MyArrayList{
private int[] elem; //用这个数组来存储数据
private int usedSize; //用来计算表中的有效个数
private static final int DEFAULLT_SIZE = 10;
//无参构造方法中默认顺序表中为10个个数
public MyArrayList(){
this.elem = new int[DEFAULLT_SIZE];
}
//有参构造方法中指定顺序表的个数为num个
public MyArrayList(int num){
this.elem = new int[num];
}
}
好啦,我们今天就讲到这里,下次见啦,
别急,还有亿点点没有讲完呐!!!
2.展示顺序表中的所有元素
我们只需要进行遍历打印输出即可~
So esay ~
是不是很简单呀?
别急,还有一个小tips:
顺序表是从零开始的,所以最大下标是uesdSize -1
//打印顺序表的所有元素
public void display(){
for(int i = 0; i < this.usedSize -1; i++){
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
3.判断表中是否包含某个元素
在该方法中传入这个元素,看看是否存在
//判断表中是否包含元素data
public boolean contains(int data){
for(int i = 0; i < this.usedSize; i++){
if(this.elem[i] == data){
return true;
}
}
return false;
}
4.查找某个元素的位置并返回下标
和上面那个代码的逻辑一样的~
遍历查找
找到则返回元素的下标~.
//查找元素data的位置
public int search(int data){
for(int i = 0; i < this.usedSize; i++){
if(this.elem[i] == data){
return i;
}
}
return -1;
}
5.判断顺序表是否为空,以及判断顺序表是否已经满了
//是否为空
public boolean isEmpty(){
return this.usedSize == 0;
}
//是否已经满了
public boolean isFull(){
return this.usedSize == this.elem.length;
}
6.获取指定位置的元素
目的:
在该方法中传入这个下标~
返回该下标的元素
步骤:
- 检验是否为空表
- 检验这个下标是否合法
- 下标不能为负数~
- 下标也不能大于实际的元素个数(usedSize)
- 以上两个条件都满足则返回元素
//获取pos下标这个位置的元素
public int get(int pos){
//检验是否为空表
is(isEmpty()){
System.out.println("这个表为空");
return 0;
}
//检验下标是否合法
if(pos < 0 || pos >= usedSize){
System.out.println("这个下标不合法");
return 0;
}
//以上都满足则可以返回元素了
retrun this.elem[pos];
}
7.给指定下标的元素更新为value
前提:依旧要去判断这个下标是否合法~
public void set(int pos, int value){
if(pos < 0 || pos >= this.usedSize){
System.out.println("pos位置不合法");
}
//pos位置合法,直接更新为value
this.elem[pos] = value;
}
8.在顺序表中新增一个元素
- 在新增之前必须先去判断这个顺序表是否已经满了
- 如果已经满了,就要进行扩容的操作了
- 而且,新增一个元素都是在末尾增加一个
- 元素增加完成之后,别忘了usedSize还要加一
//新增一个data元素
public void add(int data){
//先判满
if(isFull()){
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
this.elem[this.usedSize] = data;
this.usedSize++;
}
9.在pos位置处插入一个元素
小tips:
- 在插入之前依旧要先去判满
- 同时还要去判断pos这个下标是否合法
- 插入操作的逻辑演示如下图:
小tips:
- 插入之前也要先去判断pos下标的合法性
- 还要判断表中数据是否已经满了,若满了,要扩容
- 记得在最后usedSize要加一
//在pos位置新增元素,但是要先去挪数据(从后向前挪,因为从前向后挪会覆盖数据)
//照样要去判满
public void add(int data, int pos){
//判断pos这个下标(要插入数据的这个下标)的位置合不合法
if(pos < 0 || pos > usedSize){
System.out.println("pos位置是不合法的");
return;
}
//判满
//先判满
if(isFull()){
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
for(int i = this.UsedSize - 1; i >= pos; i--){
//把i下标的值给到i+1下标处
this.elem[i+1] = this.elem[i];
}
//挪好了之后在pos处放数据
this.elem[pos] = data;
//计数器加一
this.usedSize++;
}
10.删除某个元素
小前提:
删除之前要先去表中查看是否存在该元素
而且找到该元素的下标
我们活学活用,用刚刚才学的返回某个元素的下标这个方法~
int index = search(int data);
元素存在着返回下标,不存在则返回-1
我们一箭双雕,一石二鸟!!!
完美解决以上的两个小前提~
注意别忘了最后的usedSize要减一
顺序表中删除数据的逻辑如图:
//删除一个数据data
//删除之前要先去找这个数据
//找到之后,让后面的数据向前覆盖就可以删除这个数据了
// 当i为usedSize - 1 时,i+1 的值为null,所以i必须小于usedSize - 1
public void remove(int data){
//先去找一找这个元素是不是存在,找到了,就返回下标
int index = indexof(data);
if(index == -1){
//没有找到这个下标,说明该表中没有这个数据
System.out.println("表中没有这个数据");
return;
}
//找到啦,而且下标是index
for(int i = index; i < usedSize - 1; i++){
this.elem[i] = this.elem[i + 1];
}
//删除了之后计数器就减一
this.usedSize--;
}
11.获取顺序表的长度
//获取顺序表的长度
public int size(){
return this.usedSize;
}
12.清空顺序表
public void clear(){
this.usedSize = 0;
}
好啦,关于顺序表的操作就到此为止吧~
今天,看到这里,辛苦你啦,你真厉害!!!
祝你中秋快乐呀~
晚安~
最后,完整代码如下:
public class MyArrayList {
private int[] elem; //用这个数组来存储数据
private int usedSize; //用来计算表中的有效个数
private static final int DEFAULLT_SIZE = 10;
//无参构造方法中默认顺序表中为10个个数
public MyArrayList() {
this.elem = new int[DEFAULLT_SIZE];
}
//有参构造方法中指定顺序表的个数为num个
public MyArrayList(int num) {
this.elem = new int[num];
}
//打印顺序表的所有元素
public void display() {
for (int i = 0; i < this.usedSize - 1; i++) {
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
//判断表中是否包含元素data
public boolean contains(int data) {
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i] == data) {
return true;
}
}
return false;
}
//查找元素data的位置
public int search(int data) {
for (int i = 0; i < this.usedSize; i++) {
if (this.elem[i] == data) {
return i;
}
}
return -1;
}
public boolean isEmpty() {
return this.usedSize == 0;
}
//获取pos下标这个位置的元素
public int get(int pos) {
//检验是否为空表
if (isEmpty()) {
System.out.println("这个表为空");
return 0;
}
//检验下标是否合法
if (pos < 0 || pos >= usedSize) {
System.out.println("这个下标不合法");
return 0;
}
//以上都满足则可以返回元素了
return this.elem[pos];
}
//将指定元素更新为value
public void set(int pos, int value) {
if (pos < 0 || pos >= this.usedSize) {
System.out.println("pos位置不合法");
}
//pos位置合法,直接更新为value
this.elem[pos] = value;
}
//是否已经满了
public boolean isFull() {
return this.usedSize == this.elem.length;
}
//新增一个data元素
public void add(int data) {
//先判满
if (isFull()) {
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
this.elem[this.usedSize] = data;
this.usedSize++;
}
//在pos位置新增元素,但是要先去挪数据(从后向前挪,因为从前向后挪会覆盖数据)
//照样要去判满
public void add(int data, int pos) {
//判断pos这个下标(要插入数据的这个下标)的位置合不合法
if (pos < 0 || pos > usedSize) {
System.out.println("pos位置是不合法的");
return;
}
//判满
//先判满
if (isFull()) {
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
for (int i = this.usedSize - 1; i >= pos; i--) {
//把i下标的值给到i+1下标处
this.elem[i + 1] = this.elem[i];
}
//挪好了之后在pos处放数据
this.elem[pos] = data;
//计数器加一
this.usedSize++;
}
//删除一个数据data
//删除之前要先去找这个数据
//找到之后,让后面的数据向前覆盖就可以删除这个数据了
// 当i为usedSize - 1 时,i+1 的值为null,所以i必须小于usedSize - 1
public void remove(int data) {
//先去找一找这个元素是不是存在,找到了,就返回下标
int index = search(data);
if (index == -1) {
//没有找到这个下标,说明该表中没有这个数据
System.out.println("表中没有这个数据");
return;
}
//找到啦,而且下标是index
for (int i = index; i < usedSize - 1; i++) {
this.elem[i] = this.elem[i + 1];
}
//删除了之后计数器就减一
this.usedSize--;
}
//获取顺序表的长度
public int size() {
return this.usedSize;
}
//清空顺序表
public void clear() {
this.usedSize = 0;
}
}