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

目录

[栈 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;
}
相关推荐
懂点Tech2 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
catchadmin3 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路3 小时前
go-grpc设计思想
开发语言·后端·golang
酷炫码神4 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
careathers4 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
Elastic 中国社区官方博客5 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1885 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn5 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su6 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
传奇开心果编程6 小时前
【Rust入门练中学】第5课:引用与借用
开发语言·rust·引用·编程语言理论·通用编程语言·借用