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

目录

[栈 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;
}
相关推荐
PHP实战开发录2 小时前
PHP脚本手动能跑定时任务却失败
开发语言·php·开发
郝学胜-神的一滴3 小时前
Effective Python 条款 10 :海象运算符_=
开发语言·python·程序人生·开源
wuyk5554 小时前
Python零基础入门第十四章:异常处理(try-except)
开发语言·python
wuyk5554 小时前
【Socket 进阶之路】第 3 章 TCP 三次握手 & 四次挥手深度剖析|连接建立、断开、状态机、TIME_WAIT 核心工程问题
服务器·开发语言·网络·物联网·网络协议·tcp/ip
彧azz9 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
嵌入式学习菌10 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
matlab代码11 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
matlab代码11 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk55511 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin1997010801611 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas