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

目录

[栈 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;
}
相关推荐
水云桐程序员6 小时前
C++可以写手机应用吗
开发语言·c++·智能手机
测试员周周6 小时前
【AI测试智能体】为什么传统测试方法对智能体失效?
开发语言·人工智能·python·功能测试·测试工具·单元测试·测试用例
RSTJ_16257 小时前
PYTHON+AI LLM DAY THREETY-NINE
开发语言·人工智能·python
赏金术士8 小时前
Kotlin 从入门到进阶 之函数模块(核心基础)(二)
android·开发语言·kotlin
炸膛坦客9 小时前
嵌入式 - 数据结构与算法:(1-7)数据结构 - 顺序表和链表的对比
数据结构·链表
加号39 小时前
【Qt】 应用程序发布:依赖库拷贝与部署指南
开发语言·qt
('-')10 小时前
八股复习2:Java Array list和Linked list
java·开发语言
小黄人软件10 小时前
C++读写编辑CSV文件示例源码 用于数据导入导出,比Excel好使
开发语言·c++·excel
郭涤生10 小时前
C++各个版本的性能和安全性总结
开发语言·c++
hoiii18710 小时前
基于栅格法的机器人工作空间划分系统
数据结构·机器人