05--栈的顺序存储

153 阅读2分钟

一、栈的特性

image.png 我们从如上栈的示意图来讲一下栈的特性:

  • 1.栈是线性结构中的一个限定性数据结构,线性结构拥有的特性栈都拥有;
  • 2.栈的限定性特性是只能由栈顶入栈和出栈;
  • 3.栈的数据满足先进后出的原则。

二、栈的顺序存储的设计

1.数据准备

设计一些状态和类型重定义

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;

typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */

2.栈的设计

本文讲解的是顺序存储,所以我们按顺序存储的方式设计一个栈的结构

typedef struct
{
    SElemType data[MAXSIZE];
    int top; /*用于栈顶指针 */
}SqStack;
  • 1.数组的内存是连续的,符合顺序存储的特征,所以可以使用一个数组来保存栈的数据;
  • 2.top永远指向栈顶

三、初始化

Status InitStack(SqStack *S){
    S->top = -1;
    return OK;
}

数组的内存一但申请了,就会一直存在,初始化栈时,只需求将栈顶top指向-1来表示栈为空即可。

四、清空栈

Status ClearStack(SqStack *S){
    //清空栈时,只需要标记栈顶为-1,就不会再访问栈中的任何数据了
    S->top = -1;
    return OK;
}

五、判断栈是否为空

Status StackEmpty(SqStack S){

    if (S.top == -1)
        return TRUE;
    else
        return FALSE;
}

栈顶top为-1即为,否则不为空

六、栈的长度

int StackLength(SqStack S){
    return S.top + 1;
}

因为栈为空时top为-1,此时栈的长度为0,top的最大值为MAXSIZE - 1

七、获取栈顶

Status GetTop(SqStack S,SElemType *e){

    if (S.top == -1)
        return ERROR;
    else
        e = S.data[S.top];
   
    return OK;
}
  • 1.栈顶top为-1时栈为空,没有栈顶;
  • 2.栈不为空时,直接取栈中top位置的数据;

八、入栈

Status PushData(SqStack *S, SElemType e){
    //栈已满
    if (S->top == MAXSIZE -1) {
        return ERROR;
    }

    //栈顶指针+1;
    S->top ++;

    //将新插入的元素赋值给栈顶空间
    S->data[S->top] = e;

    return OK;
}
  • 1.栈满时,不可继续插入;
  • 2.入栈时,将栈顶指针top向上移动一个位置,然后将入栈的数据放入移动后的栈顶位置。

九、出栈

Status Pop(SqStack *S,SElemType *e){

    //空栈,则返回error;
    if (S->top == -1) {
        return ERROR;
    }
    
    //将要删除的栈顶元素赋值给e
    *e = S->data[S->top];

    //栈顶指针--;
    S->top--;

    return OK;
}
  • 1.出栈前要判断栈是否为,为空则不能出栈;
  • 2.无需对原来栈顶的数据进行处理,只需要将栈顶top向下移动一个位置,此时就不会再访问到原栈顶数据了。

十、遍历栈中数据

Status StackTraverse(SqStack S){
    int i = 0;
    printf("此栈中所有元素");
    
    while (i<=S.top) {
        printf("%d ",S.data[i++]);
    }
    printf("\n");

    return OK;
}

栈中的数据是data中从0~stop位置的数据

十一、总结

栈的特性:先进后出栈顶出入栈