Estruturas de dados e algoritmos - pilhas sequenciais e operações básicas (incluindo push e pop)

Pilha sequencial, ou seja, uma estrutura de armazenamento de pilha é implementada com uma tabela sequencial. Através do estudo anterior, sabemos que usar a estrutura de armazenamento de pilha para operar elementos de dados deve obedecer ao princípio de "primeiro a entrar, último a sair". O seguinte é "Como usar a tabela de sequência para simular a pilha e realizar as operações básicas sobre os dados na pilha (explodir e empurrar)" Fornece uma introdução detalhada.

Se você observar cuidadosamente a tabela de sequência (a implementação subjacente é um array) e a estrutura da pilha, descobrirá que a maneira como eles armazenam dados é muito semelhante, exceto que a pilha tem restrições especiais no processo de acesso a dados, enquanto a tabela de sequência não.

Por exemplo, primeiro usamos a tabela sequencial (um array) para armazenar  {1,2,3,4}, e o estado de armazenamento é mostrado na figura abaixo:

Armazenamento de tabela sequencial {1,2,3,4}

Da mesma forma, usando a estrutura de armazenamento de pilha para store  {1,2,3,4}, seu status de armazenamento é mostrado na figura a seguir:

A estrutura da pilha armazena {1,2,3,4}

Pela comparação das duas figuras acima, não é difícil perceber que é muito simples usar a tabela de sequências para simular a estrutura da pilha, bastando apenas armazenar os dados em ordem a partir da posição onde está o subscrito do array é 0.

É um método comum armazenar dados da pilha de simulação cujo subscrito é 0. Também é possível armazenar dados de outros subscritos do array.Isso é apenas para iniciantes entenderem.

Depois de entender a pilha de simulação da tabela de sequência para armazenar dados, vamos ver como simular a operação de desempilhar elementos na pilha. Como a pilha possui o requisito de "primeiro a entrar, último a sair" para a ordem de armazenamento dos elementos, se você deseja remover o elemento 1 armazenado na Figura 1 da pilha, é necessário remover o elemento 4, o elemento 3 e o elemento 2 da pilha pilha por sua vez.

Aqui está uma ideia comum de implementação de usar a tabela de sequência para simular a estrutura de armazenamento da pilha, ou seja, definir uma variável (geralmente chamada de top) na tabela de sequência que aponte para o elemento superior da pilha em tempo real, e o o valor inicial do topo é -1, indicando que não há armazenamento na pilha de elementos de dados, e a pilha é a "pilha vazia". Uma vez que um elemento de dados é colocado na pilha, top executará a operação +1; caso contrário, se o elemento de dados for removido, top executará a operação -1.

Elementos de pilha sequencial "empurrados"

Por exemplo, ainda é o processo de simulação de armazenamento em pilha  {1,2,3,4} . Inicialmente, a pilha é uma "pilha vazia", ​​ou seja, o array está vazio, e o valor do topo é o valor inicial -1, conforme mostra a figura a seguir:

Diagrama de pilha vazia

Primeiro, adicione o elemento 1 à pilha. Por padrão, o subscrito da matriz é 0, o que significa a parte inferior da pilha. Portanto, o elemento 1 é armazenado na matriz a[1] e o valor superior é +1, como mostra a figura abaixo:

Elemento de armazenamento de pilha analógica 1

Usando o método acima, armazene os elementos 2, 3 e 4 em sequência e, finalmente, o valor superior torna-se 3, conforme mostrado na figura a seguir:

Simular armazenamento de pilha {1,2,3,4}

Portanto, o código de implementação da linguagem C é:

//元素elem进栈,a为数组,top值为当前栈的栈顶位置
int push(int* a,int top,int elem){
    a[++top]=elem;
    return top;
}

a[++top]=elem no código é equivalente a executar ++top primeiro e depois executar a[top]=elem.

Elementos sequenciais da pilha "estouraram"

Na verdade, a configuração da variável top não tem nenhuma ajuda prática para a operação de "empilhamento" de dados simulados, é para preparar a operação de dados "fora da pilha".

Por exemplo, para remover o elemento 2 na figura acima da pilha, você precisa remover o elemento 4 e o elemento 3 da pilha primeiro. Deve-se notar que quando há dados fora da pilha, top deve ser definido como -1. Portanto, o processo de popping do elemento 4 e do elemento 3 é mostrado na figura a) e b) a seguir, respectivamente:

Os elementos de dados são retirados da pilha

Observe que o desaparecimento dos elementos na matriz acima é apenas para conveniência dos iniciantes. Na verdade, aqui só é necessário fazer -1 operação no valor superior, porque o próprio valor superior indica a posição superior da pilha, portanto, superior -1 é equivalente a colocar o elemento no topo da pilha. E ao adicionar elementos à pilha posteriormente, o novo elemento será armazenado na posição do elemento antigo, como o elemento 4, e o elemento antigo será substituído.

Depois que os elementos 4 e 3 são exibidos, o elemento 2 pode ser exibido. Portanto, o código de implementação da linguagem C para simular a operação de pop-up de dados usando a tabela de sequência é:

//数据元素出栈
int pop(int * a,int top){
    if (top==-1) {
        printf("空栈");
        return -1;
    }
    printf("弹栈元素:%d\n",a[top]);
    top--;
    return top;
}

A instrução if no código é para evitar que o usuário faça a operação errada de "não há dados na pilha, mas os dados precisam ser retirados da pilha". No código, para a implementação de desempilhar os elementos na pilha, apenas o valor superior -1 é necessário.

Resumir

Aprendendo a tabela de sequências e simulando o funcionamento dos dados dentro e fora da pilha, os iniciantes concluíram o estudo da pilha de sequências. Aqui está o código completo da pilha de sequências e as operações básicas sobre os dados em linguagem C:

#include <stdio.h>
//元素elem进栈
int push(int* a,int top,int elem){
    a[++top]=elem;
    return top;
}
//数据元素出栈
int pop(int * a,int top){
    if (top==-1) {
        printf("空栈");
        return -1;
    }
    printf("弹栈元素:%d\n",a[top]);
    top--;
    return top;
}
int main() {
    int a[100];
    int top=-1;
    top=push(a, top, 1);
    top=push(a, top, 2);
    top=push(a, top, 3);
    top=push(a, top, 4);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    return 0;
}

A saída do programa é:

弹栈元素:4
弹栈元素:3
弹栈元素:2
弹栈元素:1
空栈

2023 nova versão do tutorial em vídeo Java de algoritmo e estrutura de dados (parte 1), estrutura de dados e algoritmo que programadores java seniores devem aprender
2023 nova versão do tutorial em vídeo java de estrutura de dados e algoritmo (parte 2), estrutura de dados e algoritmo que programador sênior java deve aprender

Acho que você gosta

Origin blog.csdn.net/Itmastergo/article/details/131890910
Recomendado
Clasificación