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

目录

[栈 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;
}
相关推荐
郑州光合科技余经理7 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1237 天前
matlab画图工具
开发语言·matlab
dustcell.7 天前
haproxy七层代理
java·开发语言·前端
norlan_jame7 天前
C-PHY与D-PHY差异
c语言·开发语言
琢磨先生David7 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
多恩Stone7 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054967 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月7 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237177 天前
C语言-数组练习进阶
c语言·开发语言·算法
qq_454245037 天前
基于组件与行为的树状节点系统
数据结构·c#