3.1 Structure à double pile et ses opérations de base

Sujet: Stockez les deux piles numérotées 0 et 1 dans un espace de tableau d'espace V [m], et le bas de la pile se trouve aux deux extrémités du tableau. Lorsque le pointeur du haut [0] de la pile n ° 0 est -1, la pile est vide, lorsque le pointeur du haut [1] de la pile n ° 1 est m, la pile est vide. Les deux piles se développent des extrémités vers le milieu (comme indiqué dans la figure ci-dessous). Essayez d'écrire les fonctions d'initialisation à double pile, en jugeant la pile vide, la pile pleine, l'empilement, le popping et d'autres algorithmes.
La définition de la structure à double pile est la suivante:

typedef struct{
int top[2],bot[2];//栈顶和栈底指针 
SElemType *V;//栈数组 
in m;//栈最大可容纳元素的个数(也就是数组长度) 
}DblStack;

Insérez la description de l'image ici
1. Initialisation de la double pile
Idée: allouez un espace de matrice de taille m pour l'espace de double pile. Les valeurs initiales du pointeur du haut et du pointeur du bas de la pile 0 sont toutes deux -1; les valeurs initiales du pointeur du haut et du pointeur du bas de la pile 1 sont toutes les deux m. Indique que la pile est vide.

algorithme:

Status InitStack(Dblstack &S, int m){
    S.V=(SElemType *)malloc(m*sizeof(SElemType));  //为双栈分配一个大小为m的数组空间
    if(!S.V){
        return ERROR;   //存储分配失败
    }
    S.top[0]=-1;
    S.bot[0]=-1;
    S.top[1]=m;
    S.bot[1]=m;
    return OK;
}

2. Déterminez si la pile double est vide:
Idée: Lorsque le pointeur du haut de la pile et le pointeur du bas de la pile de la pile 0 pointent vers la même adresse et que le pointeur du haut de la pile et le pointeur du bas de la pile de la pile 1 pointent également vers la même adresse, le double la pile est vide.

algorithme:

Status DblstackEmpty(Dblstack &S){
    if(S.top[0]==S.bot[0]&&S.top[1]==S.bot[1]){
        return TRUE;  //栈空
    }else{
        return FALSE;  //栈非空
    }
}

3. Déterminez si la double pile est pleine.
Idée: Lorsque S.top [0] et S.top [1] sont adjacents, c'est-à-dire S.top [1] -S.top [0] == 1, le la pile est pleine.

algorithme:

Status DblstackFull(Dblstack &S){
    if(S.top[1]-S.top[0]==1)
        return TRUE;  //栈满
    else
        return FALSE; //栈不满
}

4.
Idée de pile : commencez par juger si la pile double est pleine, si elle est pleine, retournez ERROR; sinon, sauvegardez e1 en haut de pile 0, e2 en haut de pile 1 et le pointeur vers le haut de pile 0 Décalage à droite, le pointeur du haut de la pile 1 se décale vers la gauche. (Déplacer à gauche et à droite est pour l'image ci-dessus)

algorithme:

Status Push(Dblstack &S,int e1,int e2){
    if(DblstackFull(S)){  //调用3中的判满函数
        return ERROR;   //栈满,无法入栈
    }
    S.V[++S.top[0]]=e1;    //e1存到0号栈栈顶,栈顶元素右移
    S.V[--S.top[1]]=e2;    //e2存到1号栈栈顶,栈顶元素左移
    return OK;
}

5.
Idée de pile : juger d'abord si la double pile est vide, si elle est vide, renvoyer ERROR; si elle n'est pas vide, attribuer la valeur de l'élément supérieur de la pile 0 à e1, la valeur de l'élément supérieur de la pile 1 La valeur est affectée à e2, le pointeur en haut de la pile 0 est déplacé vers la gauche et l'élément en haut de la pile 1 est déplacé vers la droite. (Déplacer à gauche et à droite est pour l'image ci-dessus)

algorithme:

Status Pop(Dblstack &S,int e1,int e2){
    if(DblstackEmpty(S)){  //调用2中的判空函数
        return ERROR;    //栈为空,无法出栈
    }
    e1=S.V[S.top[0]--];  //将0号栈栈顶元素的值赋值给e1,栈顶元素左移
    e2=S.V[S.top[1]++];  //将1号栈栈顶元素的值赋值给e2,栈顶元素右移
    return OK;
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_39688282/article/details/108059487
conseillé
Classement