鱼C论坛

 找回密码
 立即注册
查看: 1493|回复: 0

[学习笔记] 栈知识总结

[复制链接]
发表于 2019-8-1 20:29:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
线性结构的两种常见的应用之一:栈定义:一种可以实现“先进后出”的存储结构(类似于箱子)


分类:
静态栈
动态栈:


算法:
出栈
压栈


直接上代码好理解:
  1. #include<stdio.h>
  2. #include<mallloc.h>
  3. #include<stdlib.h>

  4. typedef struct Node
  5. {
  6.         int data;
  7.         struct Node *pNext;
  8. }NODE,*PNODE;

  9. typedef struct Stack
  10. {
  11.         //pTop永远指向顶部,pBottom永远指向底部
  12.         PNODE pTop;
  13.         PNODE pBottom;
  14. }STACK,*PSTACK;

  15. void initStack(PSTACK pS)
  16. {
  17.         //造出一个节点,并且让pTopS指向这个节点
  18.         pS->pTop=(PDONE)malloc(sizeof(NODE));
  19.         if(NULL=pS->pTop)
  20.         {
  21.                 printf("动态内存分配失败!");
  22.                 exit(-1);
  23.         }
  24.         else
  25.         {
  26.                 pS->pButtom=pS->pTop;
  27.                 //让指向的这个节点的指针域指向NULL
  28.                 pS->pTop->pNext-NULL;
  29.         }
  30.        
  31. }

  32. void push(PSTACK pS,int val)
  33. {
  34.         //先造出一个节点来保存val的值
  35.         PNODE pNew=(PNODE)malloc(sizeof(NDOE));
  36.         //将新的节点的数据域变成val
  37.         pNew->data=val;
  38.         //将新的节点的指针域指向下一个节点(每次压入都是压入栈顶的上方
  39.         pNew->pNext=pS->pTop;
  40.         //将pTop指向新的节点
  41.         pS->pTop=pNew;

  42. }

  43. void traverse(PSTACK pS)
  44. {
  45.         //先定义一个p永远指向栈顶元素
  46.         PNODE p=pS->pTop;
  47.         while(p!=pS->pBottom)
  48.         {
  49.                 printf("%d ",p->data);
  50.                 p=p->pNext;
  51.         }
  52.         printf("\n");
  53.         return;
  54. }

  55. bool is_empty(PSTACK pS)
  56. {
  57.         if(pS->pTop==pS->pBottom)
  58.                 return true;
  59.         else
  60.                 return false
  61. }

  62. //把pS所指向的栈出栈一次,并把出栈的元素存入pVal所指向的变量中,如果出栈失败,返回false
  63. bool pop(PSTACK pS,int *pVal)
  64. {
  65.         if(is_empty(pS))  //pS本身存放的就是S的地址
  66.                 return false;
  67.         else
  68.         {       
  69.                 PNODE r=pS->pTop;
  70.                 *pVal=r->data;
  71.                 pS->pTop=r->pNext;
  72.                 free(r);
  73.                 r=NULL;
  74.                 return true;
  75.         }

  76. }

  77. void clear(PSTACK pS)  //清空
  78. {
  79.         if(is_empty(pS))
  80.         {
  81.                 return;
  82.         }
  83.         else
  84.         {
  85.                 PNODE p=pS->pTop;
  86.                 PNODE q=NULL;
  87.                 while(p!=pS->pBottom)
  88.                 {
  89.                         q=p->pNext;
  90.                         free(p);
  91.                         p=q;
  92.                 }
  93.                 pS->pTop=pS->pBottom;
  94.         }

  95. }


  96. int main()
  97. {
  98.         int val;
  99.         //相当于我们的S内存中有pTop pBottom两个变量,但是变量里面还没有存放有效的信息
  100.         STACK S;  //STACK等价于struct Stack
  101.         init(&S);  //目的是造出一个空栈
  102.         push(&S,1);   //压栈
  103.         push(&S,2);
  104.         traverse(&S);  //遍历输出

  105.         if(pop(&S,&val))
  106.         {
  107.                 printf("出栈成功,出栈的元素是:%d \n",val);
  108.         }
  109.         else
  110.                 printf("出栈失败!");

  111.         traverse(&S);  //遍历输出

  112.         clear(&S);
  113.         traverse(&S);  //遍历输出

  114.         return 0;
  115. }

复制代码


应用:
函数调用
中断
表达式求值
内存分配
缓冲处理
迷宫


线性结构的两种常见的应用之二:队列(先进先出)




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表