找回密码
 立即注册
首页 业界区 安全 线性结构常见应用之栈[基于郝斌课程]

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

缑娅瑛 2025-9-24 11:14:27
栈的定义:
  一种可以实现“先进后出”的存储结构
  栈类似于箱子,先放进去的最后取出来,最后放入的先取出来
栈的分类:
  静态栈的内核是数组
  动态栈的内核是链表
栈的算法:
  出栈
  压栈
栈的应用:
  函数调用
  中断
  表达式求值
  内存分配
  缓冲处理
  迷宫
  1. /*
  2. @file      main.c
  3. @brief     线性结构常见应用之栈
  4. @author    EricsT (EricsT@163.com)
  5. @version   v1.0.0
  6. @date      2025-09-23
  7. @history   2025-09-23 EricsT - 新建文件
  8. */
  9. #include <stdio.h>
  10. #include <malloc.h>
  11. #include <stdlib.h>
  12. typedef struct NODE
  13. {
  14.         int data;
  15.         NODE* ptrNext;
  16. }* PtrNode, Note;
  17. typedef struct STACK
  18. {
  19.         PtrNode ptrTop;
  20.         PtrNode ptrBottom;
  21. }* PtrStack, Stack;
  22. void InitStack(PtrStack ptrStack);//初始化
  23. void PushStack(PtrStack ptrStack, int pushValue);//压栈
  24. bool PopStack(PtrStack ptrStack);//出栈
  25. void TraverseStack(const PtrStack ptrStack);//遍历
  26. bool IsEmptyStack(const PtrStack ptrStack);//判断是否为NULL
  27. void ClearStack(PtrStack ptrStack);//清空栈
  28. int main(void)
  29. {
  30.         Stack stack;
  31.         InitStack(&stack);
  32.         int pushValue;
  33.         printf("请输入插入数值");
  34.         scanf("%d", &pushValue);
  35.         PushStack(&stack, pushValue);
  36.         printf("请输入插入数值");
  37.         scanf("%d", &pushValue);
  38.         PushStack(&stack, pushValue);
  39.         printf("请输入插入数值");
  40.         scanf("%d", &pushValue);
  41.         PushStack(&stack, pushValue);
  42.         printf("请输入插入数值");
  43.         scanf("%d", &pushValue);
  44.         PushStack(&stack, pushValue);
  45.         printf("请输入插入数值");
  46.         scanf("%d", &pushValue);
  47.         PushStack(&stack, pushValue);
  48.         TraverseStack(&stack);
  49.         PopStack(&stack);
  50.         TraverseStack(&stack);
  51.         ClearStack(&stack);
  52.         TraverseStack(&stack);
  53.         return 0;
  54. }
  55. void InitStack(PtrStack ptrStack)
  56. {//顶栈和底栈都指向空节点
  57.         ptrStack->ptrBottom = (PtrNode)malloc(sizeof(NODE));
  58.         ptrStack->ptrBottom->ptrNext = NULL;
  59.         ptrStack->ptrTop = ptrStack->ptrBottom;
  60. }
  61. void PushStack(PtrStack ptrStack, int pushValue)
  62. {
  63.         PtrNode ptrPushNode = (PtrNode)malloc(sizeof(NODE));
  64.         ptrPushNode->data = pushValue;
  65.         ptrPushNode->ptrNext = ptrStack->ptrTop;
  66.         ptrStack->ptrTop = ptrPushNode;
  67. }
  68. void TraverseStack(const PtrStack ptrStack)
  69. {
  70.         PtrNode ptrNodeCur = ptrStack->ptrTop;
  71.         //while (NULL != ptrNodeCur->ptrNext)
  72.         //{
  73.         //        printf("%d ", ptrNodeCur->data);
  74.         //        ptrNodeCur = ptrNodeCur->ptrNext;
  75.         //}
  76.         while (ptrStack->ptrBottom != ptrNodeCur)
  77.         {
  78.                 printf("%d ", ptrNodeCur->data);
  79.                 ptrNodeCur = ptrNodeCur->ptrNext;
  80.         }
  81.         printf("\n");
  82. }
  83. bool PopStack(PtrStack ptrStack)
  84. {
  85.         if (IsEmptyStack(ptrStack))//空栈时无法出栈
  86.                 return false;
  87.         PtrNode ptrNode = ptrStack->ptrTop;
  88.         ptrStack->ptrTop = ptrNode->ptrNext;
  89.         free(ptrNode);
  90.         //ptrStack->ptrTop = ptrStack->ptrTop->ptrNext;这种写法无法释放原来顶栈的内存
  91.         return true;
  92. }
  93. bool IsEmptyStack(const PtrStack ptrStack)
  94. {
  95.         if (ptrStack->ptrBottom == ptrStack->ptrTop)
  96.                 return true;
  97.         return false;
  98. }
  99. void ClearStack(PtrStack ptrStack)
  100. {
  101.         if (IsEmptyStack(ptrStack))
  102.                 return;
  103.         PtrNode ptrNoteCur = ptrStack->ptrTop;
  104.         PtrNode ptrNoteNext = NULL;
  105.         while (ptrStack->ptrBottom != ptrNoteCur)
  106.         {
  107.                 ptrNoteNext = ptrNoteCur->ptrNext;
  108.                 free(ptrNoteCur);//释放内存
  109.                 ptrNoteCur = ptrNoteNext;
  110.         }
  111.         ptrStack->ptrTop = ptrStack->ptrBottom;
  112. }
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册