Pile de structure de données (description du langage C)

1 Le concept de base de la pile

La pile est une table spéciale qui insère et supprime uniquement en tête de la table. Par conséquent, la tête de table a une signification particulière pour la pile, qui est appelée le haut de la pile. La fin de la table est appelée le bas de la pile. Une pile qui ne contient aucun élément est appelée une pile vide.
En supposant que les éléments d'une pile S sont a (n), a (n-1), ..., a (1), alors a (1) est appelé l'élément du bas de la pile, et a (n) est l'élément supérieur de la pile. Les éléments de la pile sont poussés dans la pile dans l'ordre de a (1), a (2), ..., a (n). À tout moment, l'élément qui est sorti de la pile est l'élément supérieur de la pile . En d'autres termes, la modification de la pile est effectuée sur le principe du dernier entré, premier sorti. Par conséquent, la pile est également appelée table Last In First Out (Last In First Out), ou table LIFO en abrégé .
Insérez la description de l'image ici

La pile est également un type de données abstrait. Les opérations de pile couramment utilisées sont les suivantes.
(1) StackEmpty (S): teste si la pile S est vide.
(2) StackFull (S): testez si la pile S est pleine.
(3) StackTop (S): retourne l'élément supérieur de la pile S.
(4) Pousser (x, S): insérer l'élément x sur le dessus de la pile S, qui est appelé élément de poussée x sur la pile.
(5) Pop (S): supprime et renvoie l'élément supérieur de la pile S, appelé pile pop.
L'application de la pile est très large, tant que le problème satisfait au principe LIFO, la pile peut être utilisée.

2 Utilisez un tableau pour implémenter une pile

Lorsqu'un tableau de données est utilisé pour stocker des éléments de pile, le bas de la pile est fixé au bas du tableau, c'est-à-dire que data [0] est le premier élément à placer sur la pile, et la pile est étendue au haut du tableau (dans le sens de l'indice croissant).

2.1 Structure de pile implémentée avec un tableau

La pile est définie comme suit.

typedef struct astack *Stack;//栈指针类型
typedef struct astack;//栈结构
	int top,//栈顶
	maxtop;//栈空间上界
	StackItem *data;//存储栈元素的数组
}Sstack;

L'élément stack est stocké dans les données du tableau, avec top pointant vers la position actuelle du haut de la pile, l'élément du haut de la pile est stocké dans data [top] et la capacité de la pile est maxtop.

2.2 Définition du type des éléments de pile

Définissez le type d'élément de pile comme int.

typedef int StackItem;//栈元素类型int
typedef StackItem *addr;//栈元素指针类型

2.3 Fonction StackInit (taille)

Créez une pile vide d'une capacité de taille.

Stack StackInit(int size)
{
    
    
	Stack S=(Stack)malloc(sizeof *S);
	S->data=(StackItem *)malloc(size*sizeof(StackItem));
	S->maxtop=size;
	S->top=-1;
	return S;
}

2.4 Fonction StackEmpty (S)

Lorsque top = -1, la pile actuelle est vide.

int StackEmpty(Stack S)
{
    
    
	return S->top<0;
}

2.5 Fonction StackFull (S)

Lorsque top = maxtop, la pile actuelle est pleine.

int StackFull(Stack S)
{
    
    
	return S->top>=S->maxtop;
}

2.6 Fonction StackTop (S)

L'élément supérieur de la pile est stocké dans data [top].

StackItem StackTop(Stack S)
{
    
    //前提栈为非空
	if(StackEmpty(S)) exit(1);
	return S->data[S->top];
}

2.7 Fonction Push (x, S)

Le nouvel élément supérieur x doit être stocké dans les données [top + 1].

void Push(StackItem x,Stack S)
{
    
    //前提栈未满
	if(StackFull(S)) exit(1);
	S->data[++S->top]=x;
}

2.8 Fonction Pop (S)

Après avoir supprimé l'élément supérieur de la pile, le nouvel élément supérieur de la pile est dans data [top-1].

StackItem Pop(Stack S)
{
    
    //栈为非空
	if(StackEmpty(S)) exit(1);
	return S->data[S->top--];
}

2.9 Fonction StackFree (S)

Étant donné que les données du tableau sont allouées dynamiquement, StackFree doit libérer l'espace alloué aux données à la fin de l'utilisation pour éviter les fuites de mémoire.

void StackFree(Stack S)
{
    
    
	free(S->data);
	free(S);
}

2.10 Utilisation de plusieurs piles

Lors de l'utilisation de piles dans certains algorithmes, il est souvent nécessaire d'utiliser plusieurs piles en même temps. Afin d'éviter que chaque pile ne déborde pendant l'exécution de l'algorithme, un espace de pile plus grand est généralement prédéfini pour chaque pile. Mais ce n'est pas facile à faire, car l'espace maximum réellement utilisé par chaque pile dans le processus de fonctionnement de l'algorithme est difficile à estimer . D'un autre côté, la taille réelle de chaque pile change constamment pendant le fonctionnement de l'algorithme , et il arrive souvent qu'une pile soit pleine et que l'autre pile soit vide.
] Supposons que les deux piles du programme partagent un tableau de données [0: n]. En utilisant la fonction selon laquelle la position inférieure de la pile reste inchangée, le bas des deux piles peut être défini aux deux extrémités des données du tableau , puis chacun s'étire vers le milieu des données du tableau. Les valeurs initiales des sommets des deux piles sont respectivement 0 et n, et un débordement peut se produire lorsque les sommets des deux piles se rencontrent. Étant donné que les deux piles peuvent se compléter, l'espace maximum réel disponible pour chaque pile est souvent supérieur à n / 2.
Deux piles partageant le même espace de baie
Insérez la description de l'image ici

3 Implémentez la pile avec des pointeurs

Un pointeur est utilisé pour implémenter une pile, appelée pile de chaînes, comme illustré dans la figure ci-dessous.
Insérez la description de l'image ici

3.1 La définition du type de nœud de la pile de chaînes

typedef struct snode *slink;//栈结点指针类型
typedef struct snode{
    
    //栈结构
	StackItem element;//栈元素
	slink next;//下一结点指针
}StackNode;

slink NewStackNode()
{
    
    
	return (slink)malloc(sizeof(StackNode));
}

Son élément de membre de données stocke les éléments de la pile, le suivant est un pointeur vers le nœud suivant et la fonction NewStackNode () crée un nouveau nœud.

3.2 Chain stack Stack implémenté avec des pointeurs

typedef struct lstack *Stack;//栈指针类型
typedef struct lstack{
    
    //栈结构
	slink top;//栈顶指针
}Lstack;

top est un pointeur vers le nœud supérieur de la pile.

3.3 Fonction StackInit (taille)

La fonction StackInit () définit top sur un pointeur nul et crée une pile vide.

Stack StackInit()
{
    
    
	Stack S=(Stack)malloc(sizeof *S);
	S->top=0;
	return S;
}

3.4 Fonction StackEmpty (S)

Vérifiez si le pointeur du haut vers le haut de la pile est un pointeur nul.

int StackEmpty(Stack S)
{
    
    
	return S->top==0;
}

3.5 Fonction StackTop (S)

Renvoie l'élément dans le nœud supérieur de la pile S.

StackItem StackTop(Stack S)
{
    
    //前提栈为非空
if(StackEmpty(S)) exit(1);
return S->top->element;
}

3.6 Fonction Push (x, S)

La fonction Push (x, S) crée d'abord un nouveau nœud pour l'élément x, puis modifie le haut du pointeur du nœud de pile de S pour faire du nouveau nœud le nouveau nœud supérieur de la pile.

void Push(StackItem x,Stack S)
{
    
    
	slink p=NewStackNode();
	p->element=x;
	p->next=S->top;
	S->top=p;
}

3.7 Fonction Pop (S)

La fonction Pop (S) stocke d'abord l'élément supérieur de S dans x, puis modifie le pointeur du haut de la pile pour pointer vers l'élément suivant de l'élément supérieur de la pile, supprimant ainsi l'élément supérieur de la pile, et renvoie finalement x.

StackItem Pop(Stack S)
{
    
    //前提栈非空
	if(StackEmpty(S)) exit(1);
	StackItem x=S->top->element;
	slink p=S->top;
	S->top=p->next;
	free(p);
	return x;
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_45059457/article/details/114778129
conseillé
Classement