数据结构:栈数据结构详解与应用

目录

[栈 3+5*6](#栈 3+5*6)

1、定义

2、特性

3、应用

4、类型:空增栈、空减栈、满增栈、满减栈

[5、顺序栈 SeqStack](#5、顺序栈 SeqStack)

CreateSeqStack

IsEmptySeqStack

IsFullSeqStack

PushSeqStack

PopSeqStack

GetTopSeqStack

DestroySeqStack

[6、链式栈 LinkStack](#6、链式栈 LinkStack)

CreateLinkStack

IsEmptyLinkStack

PushLinkStack

PopLinkStack

GetTopLinkStack

DestroyLinkStack


栈 3+5*6

1、定义

栈是限定仅在表尾进行插入和删除操作的线性表

栈顶:允许操作的一端

栈底:不允许操作的一端

入栈、出栈(压栈、弹栈)

2、特性

先进后出,后进先出

3、应用

回溯类、递归类、优先级

4、类型:空增栈、空减栈、满增栈、满减栈

增栈:当元素入栈之后,top指示器表示的地址是慢慢增大的

减栈:当元素入栈之后,top指示器表示的地址是慢慢减小的

空栈:top指示器,指向的地址,是新元素待插入的地址

满栈:top指示器,指向的地址,是最后一次入栈元素的地址

链栈:

5、顺序栈 SeqStack

连续的存储区域

CreateSeqStack
cpp 复制代码
/**
 * @brief 创建顺序栈
 *
 * @param len 栈的容量
 * @return SeqStack* 新创建栈的指针,NULL失败
 */
SeqStack* CreateSEqStack(int len)
{
  SeqStack* ss = malloc(sizeof(SeqStack));
  if (NULL == ss)
  {
    printf("CreateSeqStack malloc1 error\n");
    return NULL;
  }
  ss->head = malloc(sizeof(DATATYPE) * len);
  if (NULL == ss->head)
  {
    printf("CreateSeqStack malloc2 error\n");
    return NULL;
  }

  ss->tlen = len;
  ss->top = 0;
  return ss;
}
IsEmptySeqStack
cpp 复制代码
/**
 * @brief 判断栈是否为空
 *
 * @param ss 待操作的顺序栈
 * @return int 0空 1满
 */
int IsEmptySeqStack(SeqStack* ss)
{
     return 0 == ss->top;
}
IsFullSeqStack
cpp 复制代码
/**
 * @brief 判断栈是否满
 *
 * @param ss 待操作的顺序栈
 * @return int 0满  1空
 */
int IsFullSeqStack(SeqStack* ss)
{
    return ss->tlen == ss->top;
}
PushSeqStack
cpp 复制代码
/**
 * @brief 入栈操作,给栈新增元素
 *
 * @param ss 需要操作的顺序栈指针
 * @param newdata  需要入栈的数据
 * @return int 0成功 1失败
 */
int PushSeqStack(SeqStack* ss, DATATYPE* newdata)
{
  if (IsFullSeqStack(ss))
  {
    printf("PushSeqStack error\n");
    return 1;
  }
  memcpy(&ss->head[ss->top], newdata, sizeof(DATATYPE));
  ss->top++;
  return 0;
}
PopSeqStack
cpp 复制代码
/**
 * @brief 出栈操作
 *
 * @param ss 待操作的顺序栈
 * @return int 0成功 1失败
 */
int PopSeqStack(SeqStack* ss)
{

    if (IsEmptySeqStack(ss))
    {
        printf("PopSeqStack error\n");
        return 1;
    }
    ss->top--;
    return 0;
}
GetTopSeqStack
cpp 复制代码
/**
 * @brief 获得栈顶元素
 *
 * @param ss 待操作的顺序栈
 * @return DATATYPE* 返回栈顶元素的指针,NULL失败
 */
DATATYPE* GetTopSeqStack(SeqStack* ss)
{
    if (IsEmptySeqStack(ss))
    {
        printf("GetTopSeqStack error\n");
        return NULL;
    }
    return &ss->head[ss->top - 1];
}
DestroySeqStack
cpp 复制代码
int DestroySeqStack(SeqStack* ss)
{
}

6、链式栈 LinkStack

CreateLinkStack
cpp 复制代码
LinkStack* CreateLinkStack(int len)
{
  LinkStack* ls = malloc(sizeof(LinkStack));
  if (NULL == ls)
  {
    printf("malloc1 error\n");
    return NULL;
  }
  ls->top = NULL;
  ls->clen = 0;
  return ls;
}
IsEmptyLinkStack
cpp 复制代码
int IsEmptyLInkStack(LinkStack* ls)
{
  return 0 == ls->top;
}
PushLinkStack
cpp 复制代码
int PushLinkStack(LinkStack* ls, DATATYPE* newdata)
{
  LinkStackNode* newnode = malloc(sizeof(LinkStackNode));
  if (NULL == newnode)
  {
    printf("malloc1 error\n");
    return 1;
  }
  memcpy(&newnode->data, newdata, sizeof(DATATYPE));
  newnode->next = NULL;
  newnode->next = ls->top;
  ls->top = newnode;
  ls->clen++;
  return 0;
}
PopLinkStack
cpp 复制代码
int PopLinkStack(LinkStack* ls)
{
  if (IsEmptyLInkStack(ls))
  {
    return 1;
  }
  LinkStackNode* tmp = ls->top;
  ls->top = ls->top->next;
  free(tmp);
  ls->clen--;
  return 0;
}
GetTopLinkStack
cpp 复制代码
DATATYPE* GetTopLinkStack(LinkStack* ls)
{
  if (IsEmptyLInkStack(ls))
  {
    printf(" error\n");
    return NULL;
  }
  return &ls->top->data;
}
DestroyLinkStack
cpp 复制代码
int DestroyLInkStack(LinkStack* ls)
{
    int len=GetSizeLinkStack(ls);
    int i=0;
    for(i=0;i<len;i++)
    {
        PopLinkStack(ls);
    }
    free(ls);
    return 0;
}
相关推荐
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t8 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿9 小时前
Jsoniter(java版本)使用介绍
java·开发语言
2013编程爱好者9 小时前
【C++】树的基础
数据结构·二叉树··二叉树的遍历
NEXT069 小时前
二叉搜索树(BST)
前端·数据结构·面试
化学在逃硬闯CS9 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1239 小时前
C++使用format
开发语言·c++·算法
码说AI10 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子10 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言