当前位置: 首页 > news >正文

线性结构常见应用之栈[基于郝斌课程]

栈的定义:

  一种可以实现“先进后出”的存储结构

  栈类似于箱子,先放进去的最后取出来,最后放入的先取出来

栈的分类:

  静态栈的内核是数组

  动态栈的内核是链表

栈的算法:

  出栈

  压栈

栈的应用:

  函数调用

  中断

  表达式求值

  内存分配

  缓冲处理

  迷宫


/*
@file      main.c
@brief     线性结构常见应用之栈
@author    EricsT (EricsT@163.com)
@version   v1.0.0
@date      2025-09-23
@history   2025-09-23 EricsT - 新建文件
*/#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>typedef struct NODE
{int data;NODE* ptrNext;
}* PtrNode, Note;typedef struct STACK
{PtrNode ptrTop;PtrNode ptrBottom;
}* PtrStack, Stack;void InitStack(PtrStack ptrStack);//初始化
void PushStack(PtrStack ptrStack, int pushValue);//压栈
bool PopStack(PtrStack ptrStack);//出栈
void TraverseStack(const PtrStack ptrStack);//遍历
bool IsEmptyStack(const PtrStack ptrStack);//判断是否为NULL
void ClearStack(PtrStack ptrStack);//清空栈int main(void)
{Stack stack;InitStack(&stack);int pushValue;printf("请输入插入数值");scanf("%d", &pushValue);PushStack(&stack, pushValue);printf("请输入插入数值");scanf("%d", &pushValue);PushStack(&stack, pushValue);printf("请输入插入数值");scanf("%d", &pushValue);PushStack(&stack, pushValue);printf("请输入插入数值");scanf("%d", &pushValue);PushStack(&stack, pushValue);printf("请输入插入数值");scanf("%d", &pushValue);PushStack(&stack, pushValue);TraverseStack(&stack);PopStack(&stack);TraverseStack(&stack);ClearStack(&stack);TraverseStack(&stack);return 0;
}void InitStack(PtrStack ptrStack)
{//顶栈和底栈都指向空节点ptrStack->ptrBottom = (PtrNode)malloc(sizeof(NODE));ptrStack->ptrBottom->ptrNext = NULL;ptrStack->ptrTop = ptrStack->ptrBottom;
}void PushStack(PtrStack ptrStack, int pushValue)
{PtrNode ptrPushNode = (PtrNode)malloc(sizeof(NODE));ptrPushNode->data = pushValue;ptrPushNode->ptrNext = ptrStack->ptrTop;ptrStack->ptrTop = ptrPushNode;
}void TraverseStack(const PtrStack ptrStack)
{PtrNode ptrNodeCur = ptrStack->ptrTop;//while (NULL != ptrNodeCur->ptrNext)//{//	printf("%d ", ptrNodeCur->data);//	ptrNodeCur = ptrNodeCur->ptrNext;//}while (ptrStack->ptrBottom != ptrNodeCur){printf("%d ", ptrNodeCur->data);ptrNodeCur = ptrNodeCur->ptrNext;}printf("\n");
}bool PopStack(PtrStack ptrStack)
{if (IsEmptyStack(ptrStack))//空栈时无法出栈return false;PtrNode ptrNode = ptrStack->ptrTop;ptrStack->ptrTop = ptrNode->ptrNext;free(ptrNode);//ptrStack->ptrTop = ptrStack->ptrTop->ptrNext;这种写法无法释放原来顶栈的内存return true;
}bool IsEmptyStack(const PtrStack ptrStack)
{if (ptrStack->ptrBottom == ptrStack->ptrTop)return true;return false;
}void ClearStack(PtrStack ptrStack)
{if (IsEmptyStack(ptrStack))return;PtrNode ptrNoteCur = ptrStack->ptrTop;PtrNode ptrNoteNext = NULL;while (ptrStack->ptrBottom != ptrNoteCur){ptrNoteNext = ptrNoteCur->ptrNext;free(ptrNoteCur);//释放内存ptrNoteCur = ptrNoteNext;}ptrStack->ptrTop = ptrStack->ptrBottom;
}

 

http://www.hskmm.com/?act=detail&tid=15176

相关文章:

  • 实测对比:权威榜单之公众号排版Top 5(含效果对比与适用建议)
  • go的泛型
  • 原码补码反码
  • lc1034-边界着色
  • 【汽车电子】汽车功能安全标准 ISO 26262
  • ISO 26262的不同安全等级:ASIL-D ASIL-C ASIL-B ASIL-A
  • C#学习1
  • 02020405 EF Core基础05-EF Core反向工程、EF Core和ADO.NET Core的联系、EF Core无法做到的事情
  • 02020406 EF Core基础06-EF Core生成的SQL
  • Gemini-2.5-Flash-Image-Preview 与 GPT-4o 图像生成能力技术差异解析​ - 教程
  • 新学期每日总结(第2天)
  • 在CodeBolcks下wxSmith的C++编程教程——使用菜单和组件
  • 单调队列
  • 软工第一次编程
  • 第二次软工作业
  • 9.23总结
  • 日志|力扣|不同路径|最小路径和|动态规划|Javase|IO|File|Javaweb
  • 如何建立 5 μm 精度的视觉检测?不仅仅是相机的事
  • 函数 cmd_info_change_cur_model_group
  • 线程--相关概念、两种创建线程的方式
  • 恢复某个数据文件不适当,导致DataGuard无法open数据库
  • Nginx 部署及配置
  • vite静态资源处理
  • 洛谷B4040 [GESP202409 四级] 黑白方块 题解
  • SerpApi:一站式搜索引擎数据抓取API完全指南
  • 补whk时的鲜花(持续更新)
  • css 使用记录 随笔
  • newDay02
  • 【OI 档案-2025】CSP 赛前集训记(初赛后+复赛)
  • Git 从零到一:以 Gitee 为例的实战与可视化指南