博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言 算法与数据结构 栈
阅读量:6969 次
发布时间:2019-06-27

本文共 2870 字,大约阅读时间需要 9 分钟。

hot3.png

栈 线性数据结构的一种 可以理解为操作受限的线性表

栈的特点 先入后出 (可以想象一下装羽毛球的球筒,先放进去的在最底下)

25174501_TDex.png

栈的表尾端称为栈顶,表头称为栈底,插入和删除都只能在栈顶操作,插入操作称为入栈,弹出操作称为出栈。

下面是栈的顺序存储结构的C实现代码

#include 
#include 
#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define INIT_SIZE 20#define INCREMENT_SIZE 5typedef int SElemType;typedef int Status;/* * 存储结构 */typedef struct{    SElemType *base;    //栈尾指针    SElemType *top;        //栈顶指针    int size;            //栈的大小}SqStack;/* * 初始化栈 */  Status InitStack(SqStack *S){    S->base = (SElemType*) malloc(INIT_SIZE * sizeof(SElemType));    if (!S->base)    {        exit(OVERFLOW);    }    S->top = S->base;    S->size = INIT_SIZE;    return OK;}/* * 销毁栈 */Status DestroyStack(SqStack *S){    free(S->base);    S->base = NULL;    S->top = NULL;    S->size = 0;    return OK;}/* * 清空栈 */Status ClearStack(SqStack *S){    S->top = S->base;    return OK;}/* * 判断栈是否为空 */Status IsEmpty(SqStack S){     if (S.top == S.base)    {                return TRUE;    }        else        return FALSE;}/* * 获取栈的长度 */int GetLength(SqStack S){        return (S.top - S.base) / sizeof(SElemType);}/* * 获取栈顶元素 */Status GetTop(SqStack S, SElemType *e){        if (S.top > S.base)    {        *e = *(S.top - sizeof(SElemType));                return OK;    }        else    {                return ERROR;    }}/* * 压栈 */Status Push(SqStack *S, SElemType e){        if ((S->top - S->base) / sizeof(SElemType) >= S->size)    {        S->base = (SElemType*) realloc(S->base, (S->size + INCREMENT_SIZE) * sizeof(SElemType));        if (!S->base)        {            exit(OVERFLOW);        }        S->top = S->base + S->size * sizeof(SElemType);        S->size += INCREMENT_SIZE;    }    *S->top = e;    S->top += sizeof(SElemType);        return OK;}/* * 退栈 */Status Pop(SqStack *S, SElemType *e){        if (S->top == S->base)    {                return ERROR;    }    S->top -= sizeof(SElemType);    *e = *S->top;        return OK;}/* * 访问元素 */void visit(SElemType e){    printf("%d ", e);}/* * 遍历栈 */Status TraverseStack(SqStack S, void (*visit)(SElemType)){        while (S.top > S.base)    {        visit(*S.base);        S.base += sizeof(SElemType);    }        return OK;}int main(){    SqStack S;        if (InitStack(&S))    {        SElemType e;                int i;        printf("init_success\n");                if (IsEmpty(S))        {            printf("Stack is empty\n");        }                        for (i = 0; i < 10; i++)        {            Push(&S, i);        }        GetTop(S, &e);        printf("The first element is %d\n", e);        printf("length is %d\n", GetLength(S));        Pop(&S, &e);        printf("Pop element is %d\n", e);        TraverseStack(S, *visit);                if (DestroyStack(&S))        {            printf("\ndestroy_success\n");        }    }}

转载于:https://my.oschina.net/u/2241804/blog/647449

你可能感兴趣的文章
比较有用的一个排查sshd的命令
查看>>
戏说移动互联网&O2O模式
查看>>
PHP入门经典随笔
查看>>
Cubieboard 3(cubietruck) 安装Jenkins
查看>>
java Collection中的排序问题
查看>>
[玩硬件]Arduino初级套试玩。
查看>>
Linux运维的8个小时工作时间都做什么
查看>>
Java学习日志(20-2-IO流-Properties与流合并切割)
查看>>
Andrioid 中 Service 组件的使用
查看>>
让Spring Controller 的方法基本数据类型参数支持Bean Validation
查看>>
mybatis.xml(理解的相对局限)
查看>>
详解VirtualBox虚拟机的四种网络设置
查看>>
关于学习区块链的推荐内容
查看>>
【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲
查看>>
https原理通俗了解
查看>>
iOS开发debug集锦
查看>>
go-fasthttp源码分析
查看>>
RaspberryPi学习之SD卡文件修改及备份
查看>>
我的友情链接
查看>>
Java版InfluxDB工具类
查看>>