算法与结构-栈的实现

⭐️前言⭐️

大家好,我是大鹏,目前是一名大二的学生,这个假期我将会出一个算法与结构重要知识点讲解的专栏,以及一个每日一题LeedCode的专栏,关注我让你弯道超车,和我一起明年蓝桥杯打进国赛,加油!会则巩固之,不会更应学习之,!关注我,学好编程不迷路!

目录

⭐️前言⭐️

☀️一.栈的定义

🍅二.栈的实现

🍅1.顺序栈

🍅2.共享空间栈 

🍅3.链栈 

🍈 三.栈的具体用法

🍍四.栈的总结


 

☀️一.栈的定义

先入后出的数据结构

在 LIFO 数据结构中,将首先处理添加到队列中的最新元素。

与队列不同,栈是一个 LIFO 数据结构。通常,插入操作在栈中被称作入栈 push 。与队列类似,总是在堆栈的末尾添加一个新元素。但是,删除操作,退栈 pop ,将始终删除队列中相对于它的最后一个元素。

🍅二.栈的实现

栈又分为顺序栈共享空间栈链栈,以下为其分别实现的方法:

🍅1.顺序栈

#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int ElemType;
typedef int State;
typedef struct{   //顺序栈的存储结构
    ElemType data[MAXSIZE];   //用数组存放数据,最大为MAXSIZE,作为栈满条件
    int top;   //用作栈顶指针
}SqStack;

//初始化顺序栈
State initStack(SqStack *S){
    S->top = -1;   //将栈顶指针置为-1,即将栈作为还是空的时候
    return OK;
}

//获得顺序栈的长度
int getLength(SqStack S){
    return (S.top)+1;   //根据数组下标的规则,数组中的长度为指针+1个元素
}

//清空顺序栈
State clearStack(SqStack *S){
    S->top = -1;   //将栈顶指针重新设置为-1,即此时表示栈空
    return OK;
}

//判断顺序栈是否为空
State isEmpty(SqStack S){
    if(S.top==-1){   //如果此时栈顶指针为-1表示栈此时为空,非-1则表示非空
        return TRUE;
    }else{
        return FALSE;
    }
}

//入栈
State push(SqStack *S, ElemType *e){
    if(S->top==MAXSIZE-1){   //根据数组下标的特点,当指针指向最后一个元素时为MAXSIZE-1,此时栈满
        printf("栈满,无法入栈\n");
        return ERROR;   //栈满说明空间已满已经不可以再入栈
    }else{    //如果栈非满则执行添加过程
        S->top++;   //栈顶指针+1指向一个新的顶部空间
        S->data[S->top]=e;   //将现在指向的这个新的空的栈顶空间元素置为指定元素(后进先出)
        return OK;
    }
}

//出栈
State pop(SqStack *S, ElemType *e){
    if(S->top==-1){   //当栈顶指针指向-1,说明栈空,则无法出栈
        printf("栈空,无法出栈\n");
        return ERROR;
    }else{   //如果栈非空则执行出栈程序
        *e = S->data[S->top];   //将当前栈顶元素的指针赋给可供返回查看的e
        S->top--;   //栈顶元素出栈后,栈顶指针向下走一格,表示新的栈顶元素
        return OK;
    }
}

//获取栈顶元素(只供查看,不出栈)
State getTop(SqStack S, ElemType *e){
    if(S.top==-1){   //当栈顶指针指向-1,说明栈空,栈顶元素为空
        printf("栈空,无栈顶元素\n");
        return ERROR;
    }else{   //当栈非空的时候,则将栈顶元素赋值给可供返回查看的e,但是栈顶元素并不出栈
        *e = S.data[S.top];   //将栈顶元素赋值给e,栈顶指针top不变
        return OK;
    }
}

//遍历打印顺序栈
State printStack(SqStack S){
    if(S.top==-1){   //当栈顶指针指向-1,说明栈空,无栈元素可供打印
        printf("栈空\n");
        return ERROR;
    }
    int i=0;   //计数器,记录当前是第几个元素
    while(S.top!=-1){
        i++;   //栈顶指针还未到-1,则说明当前栈顶指针有元素,计数器+1
        printf("栈顶向下第%d个元素为:%d\n", i, S.data[S.top]);  //当前栈顶指针的元素打印出
        S.top--;   //栈顶指针向下走一格,继续进行循环打印
    }
    return OK;
}

//测试
int main(int argc, const char * argv[]) {
    SqStac
  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鹏在路上_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值