是一种 线性数据结构,它的核心规则是 “后进先出”(Last In, First Out,简称 LIFO)。可以把它想象成日常生活中的:一叠盘子:最后放上去的盘子,最先被拿下来

只允许在一端(称为 “栈顶”) 进行数据的添加(入栈)删除(出栈)操作,另一端(栈底)是封闭的,无法直接操作。

栈的核心操作

  • 入栈(push):把数据添加到栈顶;
  • 出栈(pop):从栈顶移除并返回数据(栈为空时出栈会报错);
  • 查看栈顶(peek/top):只看栈顶的数据,不删除;
  • 判空(isEmpty):检查栈是否为空;
  • 获取长度(size):查看栈中有多少个元素;
  • 判满:检查栈是否满了。

顺序栈的实现

静态数组实现栈,数组的大小由MaxSize固定,属于 “静态栈”(容量不可动态扩展,除此还有链栈

top 的含义:

  • 初始化时top = -1(表示栈为空,栈底的前一个位置);
  • 入栈时top++,再把元素存入data[top];
  • 出栈时先取data[top],再top--;
  • 栈满的条件top == MaxSize - 1(数组下标从 0 开始,最后一个位置是 MaxSize-1)

* top 更准确来说就是 SqStack.data 的下标,涉及到下标时,全部使用 top

栈的结构
#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int top;
}SqStack;

* 初始化栈S.top=-1 表示 栈为空

初始化栈
void InitStack(SqStack &S){
    S.top=-1;//初始化栈,S.top=-1表示栈为空
}
判空
bool StackEmpty(SqStack S){
    if(S.top==-1){
        return true;
    } else{
        return false;
    }
}

* 入栈:入栈前需要检查栈是否满了

入栈
bool Push(SqStack &S,ElemType x){
    // 判断栈是否满了
    if(S.top==MaxSize-1){
        return false;
    }
    S.data[++S.top]=x;
    // 等价于
    // S.top=S.top+1;
    // S.data[S.top]=x;
    return true;
}

* 查看栈顶:需要检查栈是否为空

获取栈顶元素
bool GetTop(SqStack S,ElemType &m){
    if(StackEmpty(S)){ //判空
        return false;
    }
    m=S.data[S.top]; //拿栈顶元素
    return true;
}

* 出栈:出栈前需要检查栈是否为空

出栈
bool Pop(SqStack &S,ElemType &m){
    if(StackEmpty(S)){ //判空
        return false;
    }
    m=S.data[S.top--]; //出栈
    // 等价于
    // m=S.data[S.top];
    // S.top=S.top-1;
    return true;
}

测试看看

int main() {
    SqStack S;
    InitStack(S);

    bool flag;
    flag=StackEmpty(S);
    if(flag){
        printf("stack is empty\n");
    }

    Push(S,3);
    Push(S,4);
    Push(S,5);

    ElemType m;
    flag=GetTop(S,m);
    if(flag){
        printf("get top:%d\n",m);
    }

    flag=Pop(S,m);
    if(flag){
        printf("Pop element:%d\n",m);
    }
    return 0;
}

标签: 数据结构,

添加新评论