Structure des données - compréhension initiale de la pile

la pile

définition de la pile

Une pile est une liste linéaire limitée à l'insertion ou à la suppression uniquement à la fin de la liste. Pour une pile, la fin de la table est appelée le haut de la pile et la tête de la table est appelée le bas de la pile. Une liste vide sans aucun élément de données est appelée une pile vide. Étant donné que la pile est limitée à l'insertion ou à la suppression à la fin de la liste, la pile est également appelée liste linéaire dernier entré, premier sorti (LIFO : structure Last in, First out. en abrégé).

Fonctionnement de base de la pile séquentielle

  • liste de fonctions

  • Status InitStack(SqStack *S) Initialiser la pile

  • Status GetTopStack(SqStack *S, ElemType *e) Récupère l'élément supérieur de la pile et le paramètre e stocke la valeur de l'élément supérieur de la pile.

  • Status PushStack(SqStack *S, ElemType e) Poussez la pile, poussez l'élément e sur la pile

  • Status PopStack(SqStack *S, ElemType *e) fait apparaître la pile et les éléments sautés sont stockés dans le paramètre e

  • Status EmptyStack(SqStack *S) Détermine si la pile est vide

  • StatusLengthStack(SqStack *S) Obtenez la longueur réelle de la pile

  • Status DestroyStack(SqStack *S) détruit la pile

  • Status StackTraverse(SqStack *S) parcourt la pile, imprimant chaque élément
    2.Code

  • Détermination du type de données

typedef struct {
    
    
    ElemType *base; // 栈底指针
    ElemType *top; // 栈顶指针
    int stack_size; // 栈的最大长度
} SqStack;
  • Initialiser la pile
// 初始化栈
Status InitStack(SqStack *S) {
    
    
    // 分配初始空间
    S->base = (ElemType *) malloc(Stack_Init_Size * sizeof(ElemType));
    if (!S->base) {
    
    
        exit(0);
    }
    S->top = S->base; /// 栈顶与栈底相同
    S->stack_size = Stack_Init_Size; // 栈的最大长度等于初始长度
    return 1;
}
  • Vérifiez si la pile est vide
// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可
Status EmptyStack(SqStack *S) {
    
    
    return S->base == S->top;
}
  • longueur de la pile
// 获取栈的实际长度,栈顶减去栈底指针即为栈的长度
Status LengthStack(SqStack *S) {
    
    
    if (S->top == S->base) {
    
    
        return 0;
    }
    return (Status) (S->top - S->base);
}
  • Obtenez l'élément supérieur de la pile
// 获取栈顶的元素,参数e用来存放栈顶的元素
Status GetTopStack(SqStack *S, ElemType *e) {
    
    
    if (S->top == S->base) {
    
    
        return 0;
    } 
    *e = *(S->top - 1);
    return 1;
}
  • pousser
// 进栈,参数e是要进栈的元素
Status PushStack(SqStack *S, ElemType e) {
    
    
    // 若栈的最大长度不会够用时,重新开辟,增大长度
    if (S->top - S->base >= S->stack_size) {
    
    
        S->base = (ElemType *)realloc(S->base, (S->stack_size + StackIncrement) * sizeof(ElemType));
        if (!S->base) {
    
    
            return 0;
        }
        // 栈顶指针为栈底指针加上栈之前的最大长度
        S->top = S->base + S->stack_size;
        // 栈当前的最大长度等于栈之前的最大长度与增加的长度之和
        S->stack_size += StackIncrement;
    }
    *S->top++ = e; // 先赋值,后栈顶指针上移
    return 1;
}
  • sortir
// 出栈,参数e用来存放出栈的元素
Status PopStack(SqStack *S, ElemType *e) {
    
    
    if (S->base == S->top) {
    
    
        return 0;
    }
    *e = *--S->top; // 栈顶指针先下移,后赋值
    return 1;
}
  • détruire la pile
// 销毁栈,释放栈空间,栈顶栈底指针置为NULL,长度置为0
Status DestroyStack(SqStack *S) {
    
    
    free(S->base);
    S->base = S->top = NULL;
    S->stack_size = 0;
    return 1;
}
  • parcourir la pile
// 遍历栈,依次打印每个元素
Status StackTraverse(SqStack *S) {
    
    
    ElemType *p;

    if (S->top == S->base) {
    
    
        printf("Stack is NULL.\n");
        return 0;
    }
    p = S->top;
    // 由栈顶依次向下遍历
    while (p > S->base) {
    
    
        p--;
        printf("%d ", *p);
    }
    printf("\n");
    return 1;
}

おすすめ

転載: blog.csdn.net/The_onion/article/details/123589812