【数据结构初阶】第三节.顺序表详讲

news2025/1/17 18:07:37

文章目录

前言

一、顺序表的概念

二、顺序表功能接口概览

三、顺序表基本功能的实现

四、四大功能

1、增加数据 

1.1 头插法:

1.2 尾插法

1.3 指定下标插入 

2、删除数据

2.1 头删

2.2 尾删

2.3 指定下标删除

2.4 删除首次出现的指定元素

3、查找数据

3.1 获取指定位置的元素

3.2 获取指定元素所在的位置

3.3 查找表中是否包含某个元素

4、修改数据

4.1 修改表中任意位置的元素

五、代码总结

MyArraysList.java

Test.java

总结


前言

今天我们将开始学习数据结构的第一个重点知识,顺序表的学习;顺序表是我们学习数据结构的第一个重点,一定要认真掌握,为后面其他的数据结构打下坚实的基础;

那就让我们进入到今天的课程当中吧!!!!!!!!!


一、顺序表的概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构;

一般情况下采用数组存储,在数组上完成数据的增删查改。

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。(本篇主要围绕静态顺序表展开)
  2. 动态顺序表:使用动态开辟的数组存储。

二、顺序表功能接口概览

本文将创建两个Java文件:MyArraysList.java用于顺序表的实现,Test.java用于顺序表的各个接口的测试

代码示例:

​
import java.util.Arrays;
 
public class MyArraysList {
    private int[] elem;
    private int usedSize; // 默认值是0
    private static final int DEFAULT_SIZE = 4; // 定义为常量,更加安全
 
    // 初始化顺序表
    public MyArraysList() {
        this.elem = new int[4];
    }
    // 对顺序表进行扩容
    public void expand() {}
 
    //判断当前顺序表是否为空
    public boolean isempty() {}
 
    // 判断当前顺序表是不是满了
    public boolean isFull() {}
 
    // 打印顺序表
    public void display() {}
 
 
    // 新增元素,默认在数组最后新增
    public void add(int data) {}
 
    // 新增元素,在数组最前面新增
    public void addHead(int data){}
 
    // 在 pos 位置新增元素
    public void addPos(int pos, int data) {}
 
 
    // 删除表头元素
    public void removeHead() {}
 
    // 删除表尾元素
    public void removeTail() {}
 
    // 指定下标元素的删除
    public void removePos(int pos) {}
 
    //删除第一次出现的关键字key
    public void remove(int toRemove) {}
 
 
    // 判定是否包含某个元素
    public boolean contains(int toFind) { return true; }
 
    // 查找某个元素对应的位置
    public int indexOf(int toFind) { return -1; }
    
    // 获取 pos 位置的元素
    public int getPos(int pos) { return -1; }
    
    // 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {}
    
    // 获取顺序表长度
    public int size() { return 0; }
    
    // 清空顺序表
    public void clear() {}
}

​

说明:

private int[] elem;

elem指的是新建立的一个数组;

private int usedSize; // 默认值是0

usedSize指的是数组的有效的长度;(即存储了元素的长度是多少)

private static final int DEFAULT_SIZE = 4; // 定义为常量,更加安全

并且数组的初始化的长度为4;

上述就为顺序表的一些基本实现方法;接下来我们将逐个的讲解这些方法具体是怎么实现的;


三、顺序表基本功能的实现

功能1:

对顺序表进行扩容

// 对顺序表进行扩容
    public void expand() {
        this.elem = Arrays.copyOf(this.elem, this.usedSize * 2);
        System.out.println("已经成功扩容至原来的两倍"); // 给用户提醒
    }

解析:

首先我们要知道Arrays中copyOf方法的用法;

Arrays.copyOf方法:

概念:

Arrays.copyOf()的实质其实就是改变数组的长度,实现数组的扩容和缩容。

语法格式:

Arrays.copyOf(original,newLength);
         original:需要改变的数组名
         newLength:数组改变后新的长度

代码示例说明:

public static void main(String[] args) {
		//定义一个初始数组,初始数组的长度为8
		int[] a = {1,2,3,4,5,6,7,8};
		System.out.println("源数组:"+Arrays.toString(a));
		//数组扩容,将数组的长度由8扩展为10
		      a = Arrays.copyOf(a, 10);
		System.out.println("缩容后的数组:"+Arrays.toString(a));
	}

输出结果:

最后我们就通过这个Arrays中copyOf方法完成了扩容的操作;


功能2:

判断顺序表是否为空 

     /**
     * 判断当前顺序表是否为空
     * @return true->空的,false->还没空
     */
    public boolean isempty() {
        if (this.usedSize == 0) {
            return true;
        }
        else return false;
    }

解析:

usedSize表示顺序表的有效长度;所以通过判断usedSize是否为0来实现判断顺序表是否为空的代码实现;


功能3:

判断顺序表是否已满:

    /**
     * 判断当前顺序表是不是满了
     * @return true->满了,false->还没满
     */
    public boolean isFull() {
        if (this.usedSize == this.elem.length) 
        return true;
        else return false;
    }

解析:
此处的elem.length表示的是数组的长度;当数组的长度等于顺序表的有效长度时;

则说明此顺序表是满的;


功能4:

打印顺序表:

// 打印顺序表
// 打印的第一种方式
    public void display() {
        for (int i = 0; i < this.elem.length; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }
// 打印的第二种方式,用Arrays.toString直接打印
    public void display() {
       System.out.println(Arrays.toString(this.elem));
    }

解析:

此处通过数组下标的方式来遍历数组;用数组下标与数组的长度对比;

由此来遍历整个顺序表;从而实现打印顺序表;

图示解析:


功能5:

获取顺序表的有效长度:

 // 获取顺序表的有效长度
public int size() {
    return this.usedSize;
}

解析:

直接返回有效长度usedSize即可;


功能6:

清空顺序表

 // 清空顺序表
    public void clear() {
        for (int i = 0; i < this.usedSize; i++) {
            this.elem[i] = 0;
        }
        this.usedSize = 0; // 注意有效数组长度也要清零
    }

解析:

此处的清空顺序表和前面的打印顺序表不一样;

清空顺序表只需要将顺序表里面的有效长度清除即可,不用遍历整个顺序表;

最后注意要将有效数组长度也清零;

图示解析:

四、四大功能

1、增加数据 

1.1 头插法:

1 // 新增元素,在数组最前面新增
    public void addHead(int data) {
        if (isFull()) {
            System.out.println("数组满了,需要扩容");
            expand();
        }
        else {
            // 从usedSize下标开始,不会数组越界(此时的elem.length > usedSize)
            for (int i = this.usedSize; i > 0; --i) {
                this.elem[i] = this.elem[i - 1]; // 从后往前挪动数据,为的是给顺序表的表头腾出来
            }
            this.elem[0] = data; // 在顺序表开头插入
            this.usedSize++;    // 数组有效长度加一
        }

解析:

1.

在顺序表中插入元素,首先要先 判断顺序表是否满了;

如果满了,需要扩容;如果没有满,则进行插入操作;

所以此处就需要用到前面介绍过的public boolean isFull函数;

代码示例:

if (isFull()) {
            System.out.println("数组满了,需要扩容");
            expand();

2.既然实在开头插入,那我们就应该把顺序表中每一个元素向后移动一位,把第一个位置腾空出来,再将需要的数据插入进去;

移动时肯定是先移动后面的元素,然后依次移动前一个元素;

代码示例:

for (int i = this.usedSize; i > 0; --i) {
                this.elem[i] = this.elem[i - 1]; // 从后往前挪动数据,为的是给顺序表的表头腾出来
            }
   

此代码就是实现顺序表中代码依次往后挪动的操作;

图片示例:


1.2 尾插法

//在数组最后新增
    public void addTail(int data) {
        if (isFull()) {
            System.out.println("数组满了需要扩容");
            expand();
        }
        else 
           this.elem[this.usedSize] = data;
           this.usedSize++;
    }

解析:

1.

插入操作首先要需要 判断顺序表是否满了;

同上面的头插法;

2.

既然是尾插法,就不需要进行元素的移动,直接在有效数据长度的后面插入数据即可;

最后要注意将有效数据长度增加一位(因为多存储了一个数据)

代码示例:

this.elem[this.usedSize] = data;
           this.usedSize++;

1.3 指定下标插入 

// 在 pos 位置新增元素
    public void addPos(int pos, int data) {
        if (pos < 0 || pos > usedSize) {
            System.out.println("pos位置不合法"); return;
        }
        if (isFull()) {
            System.out.println("数组满了需要扩容");
            expand();
        }
        else {
            // 如果插入位置在顺序表的中间,要注意挪动元素,从后向前挪动,这样不会造成元素值的覆盖
            for (int i = this.usedSize - 1; i >= pos; --i) {
                this.elem[i + 1] = this.elem[i];
            }
            this.elem[pos] = data; // 挪动完毕,可以赋值插入
            this.usedSize++;      // 当前元素数加一
        }
    }

解题思路:

  1.  判断pos位置是否合法(在顺序表中,数据是连续的,中间不能有空缺)
  2.  判断顺序表是否满了,如果满了,需要扩容
  3.  插入数据(可能需要1.挪动数据2.插入数据)

注意:

解析:

1. 判断pos位置是否合法(在顺序表中,数据是连续的,中间不能有空缺)

代码示例:

if (pos < 0 || pos > usedSize) {
            System.out.println("pos位置不合法"); return;
        }

在数据结构中,每次储存元素必须有一个前驱信息的结点;所以pos>usedSIze;

2.判断顺序表是否满了,如果满了,需要扩容;

这里和上面头插尾插一样,不过多赘述;

3.插入数据(可能需要1.挪动数据2.插入数据)

代码示例:

 // 如果插入位置在顺序表的中间,要注意挪动元素,从后向前挪动,这样不会造成元素值的覆盖
            for (int i = this.usedSize - 1; i >= pos; --i) {
                this.elem[i + 1] = this.elem[i];
            }
            this.elem[pos] = data; // 挪动完毕,可以赋值插入
            this.usedSize++;      // 当前元素数加一

图示说明:

当pos=2时;


2、删除数据

2.1 头删

 // 删除表头元素
    public void removeHead() {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        // 从第一个元素开始,用后面元素的值覆盖掉前面的值,遍历整个数组就相当于把第一个元素用覆盖的方式抹去了
        for (int i = 1; i < this.usedSize; i++) {
            this.elem[i - 1] = this.elem[i];
        }
        this.elem[this.usedSize - 1] = 0; // 现在的最后一个元素是原来的倒数第二个元素, 所以原来的最后一个有效元素要置0
        this.usedSize--; // 不要忘记改变有效数组的长度
    }

解题思路:

首先还是要判断顺序表是否为空的问题;

要想删除第一个元素,我们可以通过从从第一个元素开始,用后面元素的值覆盖掉前面的值,遍历整个数组就相当于把第一个元素用覆盖的方式抹去了;

现在的最后一个元素是原来的倒数第二个元素, 所以原来的最后一个有效元素要置0;

最后不要忘记改变有效数组的长度;

图示说明:


2.2 尾删

    // 删除表尾元素
    public void removeTail() {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        this.elem[this.usedSize - 1] = 0; // 直接将最后一个元素置0就完成了尾删
        this.usedSize--; // 不要忘记改变有效数组的长度
    }

解析:

首先还是判断顺序表是否为空;

然后既然尾删,那么直接将最后一个有效元素置0即可;elem[this.usedSize - 1] = 0;

最后不要忘记修改有效数组的长度;usedSize--;


2.3 指定下标删除

 // 指定下标元素的删除
    public void removePos(int pos) {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        if (pos < 0 || pos >= this.usedSize) {
            System.out.println("pos下标不合法");
        }
        else {
            for (int i = pos; i < this.usedSize ; i++) {
                this.elem[i-1] = this.elem[i]; // 从要删除的下标开始,用后边元素的值覆盖掉前面的值,就完成了删除
            }
            this.elem[this.usedSize - 1] = 0; // 要完整的删除,将挪动的最后一个元素的原本位置 置空
            this.usedSize--;// 删除后不要忘记更改顺序表的有效长度
        }
    }

解题思路:

  1. 判断pos位置是否合法(在顺序表中,数据是连续的,中间不能有空缺)
  2.  判断顺序表是否满了,如果满了,需要扩容
  3.  删除数据(覆盖数据)

解析:

此处和上面指定下标插入一样的讨论情况;

都是先判断合法和是否满了的情况;

最后通过和头删法一样的分析方法,来实现指定下标删除;


2.4 删除首次出现的指定元素

 //删除第一次出现的关键字key
    public void removeKey(int toRemove) {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toRemove) {
                // 注意是this.usedSize - 1,将此时 i 之后的元素统一往前搬移一个位置
                for (int j = i; j < this.usedSize - 1; ++j) {
                    this.elem[j] = this.elem[j + 1];
                }
                this.elem[this.usedSize - 1] = 0; // 要完整的删除,将挪动的最后一个元素的原本位置 置空
                this.usedSize--; // 删除后不要忘记更改顺序表的有效长度
                return; // 只删除第一次出现的
            }
        }
    }


3、查找数据

3.1 获取指定位置的元素

 // 获取 pos 位置的元素
    public int getPos(int pos) {
        if (pos < 0 || pos >= this.usedSize) { // 注意这里当pos==this.usedSize也是不合法的,因为此时的pos下标所要获取的是顺序表中第usedSize+1个元素
            System.out.println("pos的位置不合法");
            return -1;
        }
        else {
            return this.elem[pos];
        }
    }

解题思路:

  1. 考虑要获取的位置是否合法
  2. 返回指定位置的元素

解析:

1.要获取这个元素,首先要判断这个元素的位置是否合法;

但此处要注意pos==this.usedSize也是不合法的;因为此时的pos下标所要获取的是顺序表中第usedSize+1个元素;

2.最后直接返回指定位置的元素即可;return this.elem[pos];


3.2 获取指定元素所在的位置

 // 查找某个元素所对应顺序表中的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind) {
                return i;
            }
        }
        System.out.println("在数组中没有找到该元素");
        return -1;
    }

解析:

既然要查找一个元素的位置,那么就应该遍历整个顺序表;

代码中的toFind指的是所要查找的元素;

当elem[i] == toFind时候,说明找到了所要查找的元素;否则提示顺序表中找不到所要查找的元素;


3.3 查找表中是否包含某个元素

 /**
 * /判定是否包含某个元素
 * @param toFind 要查找的元素
 * @return true->包含, false->不包含
 */
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind)  return true;
        }
        return false;
    }

解析:

直接对整个顺序表进行遍历;直到找到所需要找的那个元素为止;this.elem[i] == toFind;

当找到了return   ture;否则return  fales;


4、修改数据

4.1 修改表中任意位置的元素

// 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if (pos < 0 || pos > this.usedSize) {
            System.out.println("pos位置不合法");
            return;
        }
        if (pos == this.usedSize) { // 对这种情况要单独处理,此时相等于增加元素
            this.elem[pos] = value;
            this.usedSize++;
        }
        else {
            this.elem[pos] = value;
        }
 
    }

解题思路:

1.首先考虑修改的位置是否合法

2.考虑特殊情况

解析:

value指的是pos位置所放置的元素;

1.首先依旧需要考虑修改位置是否合法pos < 0 || pos > this.usedSize;

2.然后考虑特殊情况,当pos=this.usedSize时;

此时就相当于新增加了一个元素,类似于前面新增数据的尾插法;

、代码总结

MyArraysList.java

import java.util.Arrays;
 
public class MyArraysList {
    private int[] elem;
    private int usedSize; // 默认值是0
    private static final int DEFAULT_SIZE = 4; // 定义为常量,更加安全
    // 初始化顺序表
    public MyArraysList() {
        this.elem = new int[4];
    }
    // 对顺序表进行扩容
    public void expand() {
        this.elem = Arrays.copyOf(this.elem, this.usedSize * 2);
        System.out.println("已经成功扩容至原来的两倍"); // 给用户提醒
    }
 
    /**
     * 判断当前顺序表是否为空
     * @return true->空的,false->还没空
     */
    public boolean isempty() {
        if (this.usedSize == 0) {
            return true;
        }
        else return false;
    }
    /**
     * 判断当前顺序表是不是满了
     * @return true->满了,false->还没满
     */
    public boolean isFull() {
        if (this.usedSize == this.elem.length) return true;
        else return false;
    }
    // 打印顺序表
    public void display() {
        for (int i = 0; i < this.elem.length; i++) {
            System.out.print(this.elem[i] + " ");
        }
        // System.out.println(Arrays.toString(this.elem));或者用Arrays.toString打印也行
        System.out.println();
    }
 
    // 新增元素,默认在数组最后新增
    public void addTail(int data) {
        if (isFull()) {
            System.out.println("数组满了需要扩容");
            expand();
        }
        else this.elem[this.usedSize++] = data;
    }
    // 新增元素,在数组最前面新增
    public void addHead(int data) {
        if (isFull()) {
            System.out.println("数组满了,需要扩容");
            expand();
        }
        else {
            // 从usedSize下标开始,不会数组越界(此时的elem.length > usedSize)
            for (int i = this.usedSize; i > 0; --i) {
                this.elem[i] = this.elem[i - 1]; // 从后往前挪动数据,为的是给顺序表的表头腾出来
            }
            this.elem[0] = data; // 在顺序表开头插入
            this.usedSize++;    // 数组有效长度加一
        }
    }
    // 1、判断pos位置是否合法(在顺序表中,数据是连续的,中间不能有空缺)
    // 2、判断顺序表是否满了,如果满了,需要扩容
    // 3、插入数据(可能需要挪作元素)
    // 在 pos 位置新增元素
    public void addPos(int pos, int data) {
        if (pos < 0 || pos > usedSize) {
            System.out.println("pos位置不合法"); return;
        }
        if (isFull()) {
            System.out.println("数组满了需要扩容");
            expand();
        }
        else {
            // 如果插入位置在顺序表的中间,要注意挪动元素,从后向前挪动,这样不会造成元素值的覆盖
            for (int i = this.usedSize - 1; i >= pos; --i) {
                this.elem[i + 1] = this.elem[i];
            }
            this.elem[pos] = data; // 挪动完毕,可以赋值插入
            this.usedSize++;      // 当前元素数加一
        }
    }
 
    // 删除表头元素
    public void removeHead() {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        // 从第一个元素开始,用后面元素的值覆盖掉前面的值,遍历整个数组就相当于把第一个元素用覆盖的方式抹去了
        for (int i = 1; i < this.usedSize; i++) {
            this.elem[i - 1] = this.elem[i];
        }
        this.elem[this.usedSize - 1] = 0; // 现在的最后一个元素是原来的倒数第二个元素, 所以原来的最后一个有效元素要置0
        this.usedSize--; // 不要忘记改变有效数组的长度
    }
    // 删除表尾元素
    public void removeTail() {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        this.elem[this.usedSize - 1] = 0; // 直接将最后一个元素置0就完成了尾删
        this.usedSize--; // 不要忘记改变有效数组的长度
    }
    // 指定下标元素的删除
    public void removePos(int pos) {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        if (pos < 0 || pos >= this.usedSize) {
            System.out.println("pos下标不合法");
        }
        else {
            for (int i = pos; i < this.usedSize - 1; ++i) {
                this.elem[i] = this.elem[i + 1]; // 从要删除的下标开始,用后边元素的值覆盖掉前面的值,就完成了删除
            }
            this.elem[this.usedSize - 1] = 0; // 要完整的删除,将挪动的最后一个元素的原本位置 置空
            this.usedSize--;// 删除后不要忘记更改顺序表的有效长度
        }
    }
    //删除第一次出现的关键字key
    public void removeKey(int toRemove) {
        if (isempty()) {
            System.out.println("顺序表为空,删除不合法");
            return;
        }
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toRemove) {
                // 注意是this.usedSize - 1,将此时 i 之后的元素统一往前搬移一个位置
                for (int j = i; j < this.usedSize - 1; ++j) {
                    this.elem[j] = this.elem[j + 1];
                }
                this.elem[this.usedSize - 1] = 0; // 要完整的删除,将挪动的最后一个元素的原本位置 置空
                this.usedSize--; // 删除后不要忘记更改顺序表的有效长度
                return; // 只删除第一次出现的
            }
        }
    }
 
    /**
     * /判定是否包含某个元素
     * @param toFind 要查找的元素
     * @return true->包含, false->不包含
     */
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind)  return true;
        }
        return false;
    }
    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind) {
                return i;
            }
        }
        System.out.println("在数组中没有找到该元素");
        return -1;
    }
    // 获取 pos 位置的元素
    public int getPos(int pos) {
        if (pos < 0 || pos >= this.usedSize) {
            System.out.println("pos的位置不合法");
            return -1;
        }
        else {
            return this.elem[pos];
        }
    }
    // 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if (pos < 0 || pos > this.usedSize) {
            System.out.println("pos位置不合法");
            return;
        }
        if (pos == this.usedSize) { // 对这种情况要单独处理,此时相等于增加元素
            this.elem[pos] = value;
            this.usedSize++;
        }
        else {
            this.elem[pos] = value;
        }
 
    }
 
    // 获取顺序表长度
    public int size() {
        return this.usedSize;
    }
    // 清空顺序表
    public void clear() {
        for (int i = 0; i < this.usedSize; i++) {
            this.elem[i] = 0;
        }
        this.usedSize = 0; // 注意有效数组长度也要清零
    }
 
}

Test.java

/**
 * 对顺序表进行测试的代码
 */
public class Test {
    public static void main(String[] args) {
        MyArraysList myArraysList = new MyArraysList();
        // 尾插四个数字
        myArraysList.addTail(12);
        myArraysList.addTail(32);
        myArraysList.addTail(17);
        myArraysList.addTail(32);
        // 进行扩容
        myArraysList.expand();
        // 指定在pos位置新增元素
        myArraysList.addPos(1, 777);
        // 打印当前的顺序表
        System.out.print("第一次测试的顺序表为:");
        myArraysList.display();
 
        // 删除顺序表中首次出现的元素32
        myArraysList.removeKey(32);
        // 获取顺序表中 1下标的元素值
        int tmp = myArraysList.getPos(1);
        System.out.println("顺序表中下标为1的元素的值为:" + tmp);
        // 给顺序表中1下标的元素设为value
        myArraysList.setPos(1, 100);
        // 打印此时的顺序表
        System.out.print("修改后第二次测试的顺序表为:"); // 此时1下标的值为100
        myArraysList.display();
 
        // 顺序表此时的有效长度
        System.out.println("顺序表的有效长度为:" + myArraysList.size());
        // 清空顺序表
        myArraysList.clear();
        System.out.print("第三次测试的顺序表为:");
        myArraysList.display();
        System.out.println("清空顺序表后,顺序表的有效长度为:" + myArraysList.size());
 
    }
 
}

测试结果:

总结

今天我们学习了数据结构的第一种顺序表的学习,下一节内容我们将进入到链表的学习,本节学习会让我们为后面的学习打下好的基础,所以说必须要能够熟练的掌握!!!!!!!!!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA-线程池技术

目录 概念 什么是线程&#xff1f; 什么是线程池&#xff1f; 线程池出现背景 线程池原理图 JAVA提供线程池 线程池参数 如果本篇博客对您有一定的帮助&#xff0c;大家记得留言点赞收藏哦。 概念 什么是线程&#xff1f; 是操作系统能够进行运算调度的最小单位。&am…

ChatGPT的解释

概念 ChatGPT&#xff0c;美国OpenAI研发的聊天机器人程序,于2022年11月30日发布。ChatGPT是人工智能技术驱动的自然 语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人 类一样来聊天交流&am…

干货 | PCB拼板,那几条很讲究的规则!

拼板指的是将一张张小的PCB板让厂家直接给拼做成一整块。一、为什么要拼板呢&#xff0c;也就是说拼板的好处是什么&#xff1f;1.为了满足生产的需求。有些PCB板太小&#xff0c;不满足做夹具的要求&#xff0c;所以需要拼在一起进行生产。2.提高SMT贴片的焊接效率。只需要过一…

如何使用python画一个爱心

1 问题 如何使用python画一个爱心。 2 方法 桌面新建一个文本文档&#xff0c;文件后缀改为.py&#xff0c;输入相关代码ctrls保存&#xff0c;关闭&#xff0c;最后双击运行。 代码清单 1 from turtle import * def curvemove(): for i in range(200): right(1) …

Vue2笔记03 脚手架(项目结构),常用属性配置,ToDoList(本地存储,组件通信)

Vue脚手架 vue-cli 向下兼容可以选择较高版本 初始化 全局安装脚手架 npm install -g vue/cli 创建项目&#xff1a;切换到项目所在目录 vue create xxx 按照指引选择vue版本 创建成功 根据指引依次输入上面指令即可运行项目 也可使用vue ui在界面上完成创建&…

Python学习-----无序序列2.0(集合的创建、添加、删除以及运算)

目录 前言&#xff1a; 什么是集合 集合的三大特性 1.集合的创建 &#xff08;1&#xff09;直接创建 &#xff08;2&#xff09;强制转换 2.集合的添加 &#xff08;1&#xff09;add&#xff08;&#xff09;函数 &#xff08;2&#xff09;update() 函数 3.集合元…

澳大利亚访问学者申请流程总结

澳大利亚访问学者申请需要注意些什么&#xff1f;下面知识人网小编整理澳大利亚访问学者申请流程总结。1、取得wsk英语成绩&#xff0c;现在都是先买票再上车了。2、联系外导&#xff0c;申请意向接收函(email)。3、向留学基金委CSC提出申请。4、获批后&#xff0c;申请正式邀请…

Python 循环语句

Python的循环语句&#xff0c;程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构&#xff0c;允许更复杂的执行路径。循环语句允许我们执行一个语句或语句组多次&#xff0c;下面是在大多数编程语言中的循环语句的一般形式&#xff1a;Python 提供了 for 循环和 whi…

【C++】类与对象理解和学习(上)

专栏放在【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持&#x1f339;类是什么&#xff1f;类是对对象进行描述的&#xff0c;是一个模型一样的东西&#xff0c;限定了类有哪些成员&#xff0c;定义出一个类并没有分配实际的内存空间来存储它&#xff08;实例化后才…

视觉感知(二):车位线检测

1. 简介 本期为大家带来车位线检测相关知识点,以及算法工程落地的全流程演示。车位线检测是自动泊车领域必不可缺的一环,顾名思义就是采用环视鱼眼相机对路面上的车位线进行检测,从而识别出车位进行泊车。 较为常规的做法是使用四颗鱼眼相机环视拼接然后在鸟瞰图上做停车位…

如何利用状态机编程实现启保停控制(含Stateflow模型介绍)

状态机的介绍这里不再赘述,概念也很简单没有过多的复杂理论。下面我们直接给出具体实现过程。有限自动状态机详细讲解请参看下面的文章链接: PLC面向对象编程系列之有限状态机(FSM)详解_RXXW_Dor的博客-CSDN博客_有限状态机 plc实现编写PLC控制机器动作类程序时,当分支比较…

【自然语言处理】主题建模:BERTopic(实战篇)

主题建模&#xff1a;BERTopic&#xff08;实战篇&#xff09;BERTopic 是基于深度学习的一种主题建模方法。201820182018 年底&#xff0c;Devlinetal.Devlin\ et\ al.Devlin et al. 提出了 Bidirectional Encoder Representations from Transformers (BERT)[1]^{[1]}[1]。BER…

web自动化测试入门篇05——元素定位的配置管理

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

Window 安装 Docker

1.开启Hyper-v 2.确定后重启 3.双击安装包进行安装 4.安装完后系统重启 5.打开Docker软件提示&#xff1a;按下图操作后重启Docker 6.设置docker镜像仓库 { “experimental”: false, “features”: { “buildkit”: true }, “registry-mirrors”: [ “https://docker.mirr…

界面组件Telerik UI for WPF R1 2023——让导航栏变得更智能!

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

大数据Kylin(一):基础概念和Kylin简介

文章目录 基础概念和Kylin简介 一、​​​​​​​OLTP与OLAP 1、​​​​​​​​​​​​​​OLTP 2、​​​​​​​​​​​​​​OLAP 3、​​​​​​​​​​​​​​OLTP与OLAP的关系 二、​​​​​​​​​​​​​​数据分析模型 1、星型模型 2、雪花模型 …

推进行业生态发展完善,中国信通院第八批RPA评测工作正式启动

随着人工智能、云计算、大数据等新兴数字技术的高速发展&#xff0c;数字劳动力应用实践步伐加快&#xff0c;以数字生产力、数字创造力为基础的数字经济占比逐年上升。近年来&#xff0c;机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;RPA&#xff09;成…

【GPLT 二阶题目集】L2-012 关于堆的判断

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种&#xff1a; x is the root&#xff1a;x是根结点&#xff1b; x and y are siblings&#xff1a;x和y是兄弟结点&#xff1b; x is the parent of y&#xff1a;x是y的父结…

MySQL数据库05——数据的查询(SELECT)

SQL强大的在于它的查询&#xff0c;查询是最重要的操作之一。 查询最基础的语法 查看student表里面全部内容&#xff1a; SELECT * FROM student整体语法格式 主要子句的语法格式归纳如下&#xff1a; SELECT [DISTINCT | ALL] select_list FROM table_sour…

MyBatis案例 | 使用映射配置文件实现CRUD操作——添加数据

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&…