Compartilhamento de tecnologia

[Estrutura de dados] Tabela de sequência

2024-07-12

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


Insira a descrição da imagem aqui

mesa linear

nós queremos conversarTabela de sequência, temos que falar primeiro sobre tabelas lineares, porque tabelas sequenciais são um tipo de tabelas lineares.

Definição de tabela linear

Como o nome sugere, uma tabela linear é uma tabela que organiza dados como linhas.
Isso pode ser entendido pensando na fila na realidade.

Características das tabelas lineares:

  • Existe uma ordem entre os elementos de dados de uma tabela linear.
  • Exceto o primeiro elemento e o último elemento, cada elemento tem um antecessor e um sucessor.

Tabela de sequência

A tabela de sequência é um parágrafoEndereços físicos são consecutivosAs unidades de armazenamento são como pessoas alinhadas uma ao lado da outra.
Uma estrutura linear que armazena elementos de dados em sequência, geralmente usandovariedadearmazenar.
Conclua a adição, exclusão, verificação e modificação de dados no array.
Qual é a aparência da tabela de sequência

Implementação da interface da tabela de sequência

Implemente você mesmo uma tabela de sequência (armazenamento de dados do tipo int), use a tabela de sequência como uma classe, implementamos algumas interfaces, ou seja, algumasmétodo de membroPara realizar a adição, exclusão, verificação e modificação de dados.

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

Construtor padrão

Por padrão, inicialmente abrimos 10 espaços de dados.

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

Defina a capacidade subjacente da tabela de sequência como initcapacity

Passe o comprimento do array e use-o para abrir espaço.

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

plugue de cauda

Novos elementos são adicionados no final do array por padrão.
Pontos a considerar:

  • Verifique se a tabela de sequência atual está cheia. Se estiver cheia, adicione espaço.
  • Um elemento é adicionado e usedSize é aumentado em 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

Adicionar elemento na posição pos

Insira o elemento no pos subscrito.
Precauções:

  • Verifique se a tabela de sequência atual está cheia. Se estiver cheia, adicione espaço.
  • Quer a posição dada seja legal ou não, uma exceção será lançada se não for legal.
  • Use um loop de trás para frente para mover os elementos após a posição pos para trás.
  • Um elemento é adicionado e usedSize é aumentado em 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

Determinar se um elemento está contido

Verifique se os dados fornecidos estão contidos na tabela de sequência.
Basta percorrê-lo diretamente, retornar verdadeiro se encontrar e retornar falso se não encontrar.

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

Encontre a posição correspondente a um elemento

Observe o índice dos dados fornecidos nesta tabela de sequência.
Basta percorrer diretamente e encontrar o subscrito de retorno sem retornar -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

Obtenha o elemento na posição pos

Produza o elemento na posição pos.
Precauções:

  • Verifique se a posição é legal
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

Defina o elemento na posição pos como valor

Modifique o elemento de posição pos.
Precauções:

  • Verifique se a posição é legal.
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

Exclua a primeira ocorrência da chave de palavra-chave

Exclua a primeira ocorrência da chave.
Precauções:

  • Percorra a pesquisa.
  • Use os elementos após a chave encontrada para cobri-los um por um na frente.
  • usedSize diminui em 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

Obtenha o comprimento da tabela de sequência

A obtenção do comprimento da tabela de sequência aqui se refere ao número de dados úteis, ou seja, usedSize.

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

Limpar lista de sequências

Defina o conteúdo da tabela de sequência como vazio.
Precauções:

  • Como a tabela de sequência real armazena genéricos, os elementos serão definidos como vazios quando percorridos um por um e serão substituídos definindo-os como 0 abaixo.
  • UsedSize também está definido como 0.
public void clear() {
        for (int i = 0; i < usedSize; i++) {
            elem[i] = 0;
        }
        usedSize = 0;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ArrayList em Java

A classe ArrayList é fornecida em Java para representar uma lista sequencial.

interface implementada

interface implementada

Descrição da interface:

  1. A interface RandomAccess indica suporte para acesso aleatório.
  2. A interface Cloneable indica suporte para clonagem.
  3. A interface Serializable indica suporte para serialização.

Método de construção

Java fornece 3 métodos de construção conforme mostrado na tabela:

métodoIntrodução ao uso do método
Lista de Matriz()Construção sem argumentos
ArrayList(Coleção<? extends E> c)Construir ArrayList usando outras coleções
ArrayList(int capacidadeinicial)Especifique a capacidade inicial da tabela de sequência

Métodos comuns

Os métodos comuns fornecidos são semelhantes aos que implementamos acima.
Métodos comuns

Vantagens e desvantagens das listas de sequências

vantagem

As vantagens das tabelas de sequência são as seguintes:

  1. O acesso aleatório é suportado.
  2. Consultar um determinado subscrito é rápido.

deficiência

  1. Se não houver espaço suficiente, ele precisará ser ampliado e haverá desperdício de memória.
  2. A inserção e exclusão no cabeçalho e no meio moverão os dados.

prática

Os links para os exercícios estão abaixo:
Triângulo Yang Hui