数据结构——栈的初认识

栈的定义

栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈底(bottom)。不含任何数据元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。

顺序栈的基本操作

  • 函数列表

  • Status InitStack(SqStack *S) 初始化栈

  • Status GetTopStack(SqStack *S, ElemType *e) 获取栈顶元素,参数e存放栈顶元素的值

  • Status PushStack(SqStack *S, ElemType e) 进栈,将元素e入栈

  • Status PopStack(SqStack *S, ElemType *e) 出栈,出栈的元素存放在参数e中

  • Status EmptyStack(SqStack *S) 判断栈是否为空

  • Status LengthStack(SqStack *S) 获取栈的实际长度

  • Status DestroyStack(SqStack *S) 销毁栈

  • Status StackTraverse(SqStack *S) 遍历栈,打印每个元素
    2.代码实现

  • 数据类型的确定

typedef struct {
    
    
    ElemType *base; // 栈底指针
    ElemType *top; // 栈顶指针
    int stack_size; // 栈的最大长度
} SqStack;
  • 初始化栈
// 初始化栈
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;
}
  • 判断栈是否为空
// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可
Status EmptyStack(SqStack *S) {
    
    
    return S->base == S->top;
}
  • 栈的长度
// 获取栈的实际长度,栈顶减去栈底指针即为栈的长度
Status LengthStack(SqStack *S) {
    
    
    if (S->top == S->base) {
    
    
        return 0;
    }
    return (Status) (S->top - S->base);
}
  • 获取栈顶元素
// 获取栈顶的元素,参数e用来存放栈顶的元素
Status GetTopStack(SqStack *S, ElemType *e) {
    
    
    if (S->top == S->base) {
    
    
        return 0;
    } 
    *e = *(S->top - 1);
    return 1;
}
  • 进栈
// 进栈,参数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;
}
  • 出栈
// 出栈,参数e用来存放出栈的元素
Status PopStack(SqStack *S, ElemType *e) {
    
    
    if (S->base == S->top) {
    
    
        return 0;
    }
    *e = *--S->top; // 栈顶指针先下移,后赋值
    return 1;
}
  • 销毁栈
// 销毁栈,释放栈空间,栈顶栈底指针置为NULL,长度置为0
Status DestroyStack(SqStack *S) {
    
    
    free(S->base);
    S->base = S->top = NULL;
    S->stack_size = 0;
    return 1;
}
  • 遍历栈
// 遍历栈,依次打印每个元素
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