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:
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:
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:
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:
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:
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:
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