Structures de données et algorithmes - piles séquentielles et opérations de base (y compris push et pop)

Pile séquentielle, c'est-à-dire qu'une structure de stockage en pile est implémentée avec une table séquentielle. Grâce à l'étude précédente, nous savons que l'utilisation de la structure de stockage de la pile pour exploiter les éléments de données doit respecter le principe du "premier entré, dernier sorti". Ce qui suit est "Comment utiliser la table de séquence pour simuler la pile et réaliser les opérations de base sur les données dans la pile (sauter et pousser)" Vous donner une introduction détaillée.

Si vous observez attentivement la table de séquence (l'implémentation sous-jacente est un tableau) et la structure de la pile, vous constaterez que la façon dont elles stockent les données est très similaire, sauf que la pile a des restrictions spéciales sur le processus d'accès aux données, tandis que la table de séquence ne fait pas.

Par exemple, nous utilisons d'abord la table séquentielle (un tableau) pour stocker  {1,2,3,4}, et l'état de stockage est illustré dans la figure ci-dessous :

Stockage de table séquentielle {1,2,3,4}

De même, en utilisant la structure de stockage de pile pour stocker  {1,2,3,4}, son état de stockage est illustré dans la figure suivante :

La structure de la pile stocke {1,2,3,4}

À partir de la comparaison des deux figures ci-dessus, il n'est pas difficile de voir qu'il est très simple d'utiliser la table de séquence pour simuler la structure de la pile et qu'il suffit de stocker les données dans l'ordre à partir de la position où l'indice du tableau a est 0.

Il s'agit d'une méthode courante pour stocker les données de la pile de simulation dont l'indice est 0. Il est également possible de stocker des données d'autres indices du tableau. C'est juste pour les débutants à comprendre.

Après avoir compris la pile de simulation de table de séquence pour stocker des données, voyons comment simuler l'opération d'éclatement d'éléments dans la pile. Étant donné que la pile a l'exigence de "premier entré, dernier sorti" pour l'ordre de stockage des éléments, si vous souhaitez supprimer l'élément 1 stocké dans la figure 1 de la pile, vous devez supprimer l'élément 4, l'élément 3 et l'élément 2 de la empiler à son tour.

Voici une idée d'implémentation courante consistant à utiliser la table de séquence pour simuler la structure de stockage de la pile, c'est-à-dire définir une variable (généralement nommée top) dans la table de séquence qui pointe vers l'élément supérieur de la pile en temps réel, et le La valeur initiale de top est -1, indiquant qu'il n'y a pas de stockage dans la pile d'éléments de données et que la pile est la "pile vide". Une fois qu'un élément de données est poussé dans la pile, top effectuera l'opération +1 ; sinon, si l'élément de données est dépilé, top effectuera l'opération -1.

Éléments de pile séquentiels "poussés"

Par exemple, il s'agit toujours du processus de simulation du stockage en pile  {1,2,3,4} . Initialement, la pile est une "pile vide", c'est-à-dire que le tableau est vide et que la valeur supérieure est la valeur initiale -1, comme illustré dans la figure suivante :

Diagramme de pile vide

Tout d'abord, ajoutez l'élément 1 à la pile. Par défaut, l'indice du tableau est 0, ce qui signifie le bas de la pile. Par conséquent, l'élément 1 est stocké dans le tableau a[1], et la valeur supérieure est +1, comme le montre la figure ci-dessous :

Élément de stockage de pile analogique 1

En utilisant la méthode ci-dessus, stockez les éléments 2, 3 et 4 dans l'ordre, et enfin, la valeur supérieure devient 3, comme illustré dans la figure suivante :

Simuler le stockage de pile {1,2,3,4}

Par conséquent, le code d'implémentation du langage C est :

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

a[++top]=elem dans le code équivaut à exécuter d'abord ++top, puis à exécuter a[top]=elem.

Éléments de pile séquentiels "sautés"

En fait, le réglage de la variable supérieure n'a aucune aide pratique pour l'opération "pile" des données simulées, il s'agit de préparer l'opération "hors pile" des données.

Par exemple, pour faire sortir l'élément 2 de la figure ci-dessus de la pile, vous devez d'abord faire sortir l'élément 4 et l'élément 3 de la pile. Il convient de noter que lorsqu'il y a des données hors de la pile, top doit être défini sur -1. Par conséquent, le processus d'éclatement de l'élément 4 et de l'élément 3 est illustré respectivement dans les figures a) et b) suivantes :

Les éléments de données sont extraits de la pile

Notez que la disparition des éléments dans le tableau ci-dessus n'est que pour la commodité des débutants. En fait, ici, il suffit de faire -1 opération sur la valeur supérieure, car la valeur supérieure elle-même indique la position supérieure de la pile, donc top -1 équivaut à Pop l'élément en haut de la pile. Et lors de l'ajout ultérieur d'éléments à la pile, le nouvel élément sera stocké à la position de l'ancien élément comme l'élément 4, et l'ancien élément sera écrasé.

Une fois que les éléments 4 et 3 sont tous sortis, l'élément 2 peut être sorti. Par conséquent, le code d'implémentation du langage C pour simuler l'opération de pop-up de données à l'aide de la table de séquence est :

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

L'instruction if dans le code est d'empêcher l'utilisateur de faire la mauvaise opération de "il n'y a pas de données dans la pile mais les données doivent être extraites de la pile". Dans le code, pour l'implémentation du popping des éléments dans la pile, seule la valeur supérieure -1 est requise.

Résumer

En apprenant la table de séquence et en simulant le fonctionnement des données dans et hors de la pile, les débutants ont complété l'étude de la pile de séquence. Voici le code complet de la pile de séquence et les opérations de base sur les données en langage 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;
}

La sortie du programme est :

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

2023 nouvelle version du didacticiel vidéo Java sur la structure de données et l'algorithme (partie 1), structure de données et algorithme que les programmeurs java seniors doivent apprendre
2023 nouvelle version du didacticiel vidéo Java sur la structure de données et l'algorithme (partie 2), structure de données et algorithme que le programmeur java senior doit apprendre

Je suppose que tu aimes

Origine blog.csdn.net/Itmastergo/article/details/131890910
conseillé
Classement