Обмен технологиями

[Структура данных] Таблица последовательности

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Вставьте сюда описание изображения

линейный стол

мы хотим поговоритьТаблица последовательности, сначала нам нужно поговорить о линейных таблицах, потому что последовательные таблицы — это тип линейных таблиц.

Определение линейной таблицы

Как следует из названия, линейная таблица — это таблица, в которой данные организованы как строки.
Это можно понять, подумав об очередях в реальности.

Характеристики линейных столов:

  • Между элементами данных линейной таблицы существует порядок.
  • За исключением первого и последнего элементов, каждый элемент имеет предшественника и преемника.

Таблица последовательности

Таблица последовательности представляет собой абзацФизические адреса последовательныеЕдиницы хранения похожи на людей, выстроившихся в очередь друг за другом.
Линейная структура, в которой элементы данных хранятся последовательно, обычно с использованиеммножествохранилище.
Выполните добавление, удаление, проверку и изменение данных в массиве.
Как выглядит таблица последовательности

Реализация интерфейса таблицы последовательностей

Реализуйте таблицу последовательностей самостоятельно (хранилище данных типа int), используйте таблицу последовательностей как класс, реализуем некоторые интерфейсы, то есть некоторыеметод-членОсуществлять добавление, удаление, проверку и изменение данных.

public class SeqList {
     private int[] elem;
     private int usedSize;
     // 默认构造方法
     SeqList(){   }
     // 将顺序表的底层容量设置为initcapacity
     SeqList(int initcapacity){   }
     // 新增元素,默认在数组最后新增
     public void add(int data) { }
     // 在 pos 位置新增元素
     public void add(int pos, int data) { }
     // 判定是否包含某个元素
     public boolean contains(int toFind) { return true; }
     // 查找某个元素对应的位置
     public int indexOf(int toFind) { return -1; }
     // 获取 pos 位置的元素
     public int get(int pos) { return -1; }
     // 给 pos 位置的元素设为 value
     public void set(int pos, int value) {   }
     //删除第一次出现的关键字key
     public void remove(int toRemove) {   }
     // 获取顺序表长度
     public int size() { return 0; }
     // 清空顺序表
     public void clear() {   }
     
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Конструктор по умолчанию

По умолчанию мы изначально открываем 10 пространств данных.

private static final int DEFAULT_SIZE = 10;
    public SeqList() {
        this.elem= new int[DEFAULT_SIZE];
    }
  • 1
  • 2
  • 3
  • 4

Установите базовую емкость таблицы последовательности на initcapacity.

Передайте длину массива и используйте длину массива, чтобы освободить место.

private static final int DEFAULT_SIZE = 10;
    public SeqList(int initcapacity) {
        this.elem= new int[initcapacity];
    }
  • 1
  • 2
  • 3
  • 4

хвостовая пробка

По умолчанию новые элементы добавляются в конец массива.
Моменты, которые следует учитывать:

  • Проверьте, заполнена ли текущая таблица последовательностей. Если она заполнена, добавьте место.
  • Добавляется элемент, а значение useSize увеличивается на 1.
 public void add(int data) {
        if(isFull()){
            elem = Arrays.copyOf(elem,elem.length * 2);
        }
        elem[usedSize++] = data;
    }
     /**
     * 判断当前的顺序表是不是满的!
     *
     * @return true:满   false代表空
     */
    private boolean isFull() {
        return usedSize == elem.length;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Добавить элемент в позицию позиции

Вставьте элемент в индекс pos.
Меры предосторожности:

  • Проверьте, заполнена ли текущая таблица последовательностей. Если она заполнена, добавьте место.
  • Проверьте, является ли данная позиция допустимой. Если она недопустима, будет выдано исключение.
  • Используйте цикл назад-вперед, чтобы переместить элементы после позиции pos назад.
  • Добавляется элемент, а значение useSize увеличивается на 1.
private boolean checkPosInAdd(int pos) throws PosIllegalException{

        if(pos < 0 || pos > usedSize){
            throw new PosIllegalException("位置不合法");
        }
        return true;
    }

    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        try{
            if(checkPosInAdd(pos)){
                if(isFull()){
                    elem = Arrays.copyOf(elem,elem.length * 2);
                }
                for (int i = usedSize; i > pos ; i--) {
                    elem[i] = elem[i-1];
                }
                elem[pos] = data;
                usedSize++;
            }
        }catch(PosIllegalException e){
            e.printStackTrace();
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Определить, содержится ли элемент

Посмотрите, включены ли данные данные в таблицу последовательности.
Просто пройдите по нему напрямую, верните true, если найдете его, и верните false, если нет.

public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Найдите позицию, соответствующую элементу

Посмотрите на индекс данных в этой таблице последовательности.
Просто пройдите напрямую и найдите индекс возврата, не возвращая -1.

public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Получить элемент в позиции позиции

Выведите элемент в позиции позиции.
Меры предосторожности:

  • Проверьте, является ли позиция законной
public int get(int pos) {
        try{
            if(checkPosInAdd(pos)){
                return elem[pos];
            }
        }catch(PosIllegalException e){
            e.printStackTrace();
        }
        return 0;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Установите элемент в позиции pos на значение

Измените элемент позиции позиции.
Меры предосторожности:

  • Проверьте, является ли pos законным.
public void set(int pos, int value) {
        try{
            if(checkPosInAdd(pos)){
                elem[pos] = value;
            }
        }catch(PosIllegalException e){
            e.printStackTrace();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Удалить первое вхождение ключа ключевого слова

Удалите первое вхождение ключа.
Меры предосторожности:

  • Прокрутите поиск.
  • Используйте элементы после найденного ключа, чтобы закрыть их один за другим вперед.
  • UsedSize уменьшается на 1.
public void remove(int key) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == key){
                for (int j = i; j < usedSize - 1; j++) {
                    elem[j] = elem[j + 1];
                }
                usedSize--;
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Получить длину таблицы последовательности

Получение длины таблицы последовательности здесь относится к количеству полезных данных, то есть UsedSize.

public int size() {
        return usedSize;
    }
  • 1
  • 2
  • 3

Очистить список последовательностей

Установите пустое содержимое таблицы последовательности.
Меры предосторожности:

  • Поскольку реальная последовательная таблица хранит дженерики, элементы становятся пустыми при прохождении один за другим и заменяются, устанавливая для них значение 0 ниже.
  • UsedSize также имеет значение 0.
public void clear() {
        for (int i = 0; i < usedSize; i++) {
            elem[i] = 0;
        }
        usedSize = 0;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ArrayList в Java

Класс ArrayList предоставляется в Java для представления последовательного списка.

реализованный интерфейс

реализованный интерфейс

Описание интерфейса:

  1. Интерфейс RandomAccess указывает на поддержку произвольного доступа.
  2. Интерфейс Cloneable указывает на поддержку клонирования.
  3. Интерфейс Serializable указывает на поддержку сериализации.

Метод строительства

Java предоставляет 3 метода построения, как показано в таблице:

методВведение в использование метода
ArrayList()Конструкция без аргументов
ArrayList(Коллекция<? extends E> в)Создайте ArrayList, используя другие коллекции.
ArrayList(int initialCapacity)Укажите начальную емкость таблицы последовательности

Общие методы

Предоставленные общие методы аналогичны тем, которые мы реализовали выше.
Общие методы

Преимущества и недостатки списков последовательностей

преимущество

Преимущества таблиц последовательностей заключаются в следующем:

  1. Поддерживается произвольный доступ.
  2. Запрос данного индекса выполняется быстро.

недостаток

  1. Если места недостаточно, его нужно расширить, а это будет пустая трата памяти.
  2. Вставка и удаление в заголовке и середине приведет к перемещению данных.

упражняться

Ссылки на упражнения ниже:
Треугольник Ян Хуэй