pBottom执行栈底有效元素的前一个节点,该节点没有存储有效数据,这样设计是便于栈的管理,向链表一样pHead指向链表的第一个节点,该节点是不存储有效数据的

pTop执行栈顶最新的节点

如果pTop和pBottom的值一样,说明栈是空的

经过初始化栈之后,栈的结构是:

向栈中添加一个数据

所以pBottom永远执行栈顶有效节点的前一个节点,该节点不存储有效数据,该节点的pNext下一个节点为NULL

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. /*
  7. 使用链表使用一个栈的数据结构
  8.  
  9. */
  10. //定义一个链表的节点
  11. typedef struct Node{
  12. int data;//数据域
  13. struct Node * pNext;
  14. }NODE,*PNODE;
  15.  
  16. typedef struct Stack{
  17. PNODE pTop; //栈顶指针
  18. PNODE pBottom; //栈底的指针
  19. }STACK,*PSTACK; //STACK等价于 struct Stack, PSTACK等价于 struct Stack*
  20.  
  21. /*初始化栈
  22. void init(struct Stack* pStack){
  23. */
  24. void initStack(PSTACK pStack){
  25. pStack->pTop = (PNODE)malloc(sizeof(NODE));
  26. if(NULL == pStack->pTop ){
  27. printf("分配内存失败");
  28. exit(-);
  29. }else{
  30. pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
  31. pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点
  32. }
  33.  
  34. }
  35.  
  36. /*
  37. 将数据放入栈中
  38.  
  39. */
  40. void pushStack(PSTACK pStack,int val){
  41. PNODE pNew = (PNODE)malloc(sizeof(NODE));//产生一个新的节点
  42. pNew->data = val;//把值添加到新的节点中
  43. pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
  44. pStack->pTop = pNew;//最新栈顶的值等于最新的节点
  45.  
  46. }
  47.  
  48. /**对栈的数据进行遍历操作
  49. 栈的数据是先进后出
  50. 定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出
  51. */
  52.  
  53. void traverse(PSTACK pStack){
  54. PNODE p = pStack->pTop;
  55. //对p进行遍历输出
  56. while(p != pStack->pBottom){
  57. //输出变量的结果
  58. printf("%d\n",p->data);
  59. p = p->pNext;
  60. }
  61. }
  62.  
  63. int main(){
  64. STACK s;//
  65. initStack(&s);
  66. pushStack(&s,);
  67. pushStack(&s,);
  68. pushStack(&s,);
  69. pushStack(&s,);
  70. traverse(&s);
  71. return ;
  72. }

我们来看程序的运行效果是:

可以完善下面的代码:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. /*
  7. 使用链表使用一个栈的数据结构
  8.  
  9. */
  10. //定义一个链表的节点
  11. typedef struct Node{
  12. int data;//数据域
  13. struct Node * pNext;
  14. }NODE,*PNODE;
  15.  
  16. typedef struct Stack{
  17. PNODE pTop; //栈顶指针
  18. PNODE pBottom; //栈底的指针
  19. }STACK,*PSTACK; //STACK等价于 struct Stack, PSTACK等价于 struct Stack*
  20.  
  21. /*初始化栈
  22. void init(struct Stack* pStack){
  23. */
  24. void initStack(PSTACK pStack){
  25. pStack->pTop = (PNODE)malloc(sizeof(NODE));
  26. if(NULL == pStack->pTop ){
  27. printf("分配内存失败");
  28. exit(-);
  29. }else{
  30. pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
  31. pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点
  32. }
  33.  
  34. }
  35.  
  36. /*
  37. 将数据放入栈中
  38.  
  39. */
  40. void pushStack(PSTACK pStack,int val){
  41. PNODE pNew = (PNODE)malloc(sizeof(NODE));//产生一个新的节点
  42. pNew->data = val;//把值添加到新的节点中
  43. pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
  44. pStack->pTop = pNew;//最新栈顶的值等于最新的节点
  45.  
  46. }
  47.  
  48. /*判断栈是否是空*/
  49. bool isEmpty(PSTACK pStack){
  50. if(pStack->pTop == pStack->pTop){
  51. return true;//空栈
  52. }else{
  53. return false;
  54. }
  55. }
  56.  
  57. /*数据的出栈,将出栈的数据保存到int*val中*/
  58. bool popStack(PSTACK pStack,int*val){
  59.  
  60. if(isEmpty(pStack)){//栈是空的
  61. return false;
  62.  
  63. }else{
  64. PNODE p = pStack->pTop;
  65. (*val) = p->data;
  66. pStack->pTop = p->pNext;
  67. free(p); //一定要记得释放内存
  68. p= NULL;
  69. return true
  70. }
  71.  
  72. }
  73.  
  74. /*清空栈的元素
  75. 让栈回到初始化的状态
  76. */
  77. void clear(PSTACK pStack){
  78. if(isEmpty(pStack)){//栈是空的
  79. return ;
  80. }else{
  81. PNODE p = pStack->pTop;
  82. PNODE q = NULL;
  83. while(p != pStack->pBottom ){
  84. q = p->pNext;
  85. free(p);
  86. p=q;
  87. }
  88. //最后
  89. pStack->pTop = pStack->pBottom;
  90. }
  91.  
  92. }
  93.  
  94. /**对栈的数据进行遍历操作
  95. 栈的数据是先进后出
  96. 定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出
  97. */
  98.  
  99. void traverse(PSTACK pStack){
  100. PNODE p = pStack->pTop;
  101. //对p进行遍历输出
  102. while(p != pStack->pBottom){
  103. //输出变量的结果
  104. printf("%d\n",p->data);
  105. p = p->pNext;
  106. }
  107. }
  108.  
  109. int main(){
  110. STACK s;//
  111. initStack(&s);
  112. pushStack(&s,);
  113. pushStack(&s,);
  114. pushStack(&s,);
  115. pushStack(&s,);
  116. traverse(&s);
  117. return ;
  118. }

33_栈程序演示.swf的更多相关文章

  1. 47 _ 循环队列程序演示.swf

    通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h&g ...

  2. C程序演示产生僵死进程的过程

    先抄录网上一段对僵死进程的描述: 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种 ...

  3. 制作Android Demo GIF:程序演示效果GIF图录制

    [转] 制作Android Demo GIF:程序演示效果GIF图录制   在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...

  4. MapGuide应用程序演示样例——你好,MapGuide!

    图 3‑4显示了基于MapGuide的Web应用程序的开发流程,整个开发流程能够分为五个阶段.图中,矩形代表任务,椭圆形被任务使用的或被任务创建的实体,箭头代表数据流. 1) 载入文件类型的数据,配置 ...

  5. Java全栈程序员之03:Ubuntu下安装idea

    JetBrains的产品我曾经用过很长一段时间,它们是resharper和dotcover.VS号称宇宙最强IDE,直到它遇到了resharper,我们才知道,原来vs可以更好.DotCover是一个 ...

  6. 【UNIX网络编程(三)】TCP客户/server程序演示样例

    上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...

  7. 20155301第十一周java课栈程序

    20155301第十一周java课栈程序 内容一:后序表达式: abcde/-f+ 内容二:根据填充以下代码: import java.util.Scanner; public class MyDCT ...

  8. html5 canvas程序演示--P1197 [JSOI2008]星球大战

    html5 canvas程序演示--P1197 [JSOI2008]星球大战 <!doctype html> <html> <head> <meta char ...

  9. Java全栈程序员之08:MAVEN+JAVA配置

    从Spring3.0开始,Spring支持以Java配置的方式来代替XML配置.这一点说起来其实有点可笑,XML配置的方式最初被创建出来就是为了让配置与程序员无关.可是最终我们发现,绝大多数的那些配置 ...

随机推荐

  1. [SD.TEAM语录]AC语录

    决定做了就要马上去做,不要有任何犹豫     本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士) 转载自[宝宝巴士SuperDo团队] 原文链接: http:// ...

  2. 乌云jsonp案例

    新浪微博之点击我的链接就登录你的微博(JSONP劫持) 生活处处有惊喜啊!逛逛wooyun都能捡到bug. 测试的时候没关burp,逛乌云的时候抓到一条url: http://login.sina.c ...

  3. python3程序开发指南——第1章 笔记

    python文件的扩展名为.py ,但是python GUI程序的扩展名为.pyw 在python中,注释以#开始,作用范围为该行 IDLE提供了三个关键功能:输入python表达式与代码,并在pyt ...

  4. Win2003远程桌面突然无法连接,有没有解决方法?

    在日常工作中,运维人员除了接触服务器监控工具外,最常用的应该就是远程桌面了吧.iis7远程桌面是一款绿色小巧的服务器管理工具,更加人性化,管理服务器更是不可测量. 可以管理1000台服务器的远程桌面: ...

  5. Rocket - tilelink - AtomicAutomata

    https://mp.weixin.qq.com/s/O7VTHqpCFNJQi3EpucXkIw   简单介绍AtomicAutomata的实现.(细节问题太多,恕不完全表述.)   ​​   1. ...

  6. 聚类算法之k-均值聚类

    k-均值聚类算法 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 适用数据类型:数值型数据 其工作流程:首先,随机确定k个初始点作为质心,然后将数据集中的每个点分配到一个簇中,具 ...

  7. undefined attribute name (XXXX)

    Window --> Preferences --> Web --> HTML Files --> Editor --> Validation --> Attrib ...

  8. JAVASE(七)面向对象:封装性(特性之一)、构造器、属性、关键字

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.封装性 1.为什么要使用封装性? 创建对象以后,可以通过对象.属性名的方法进行赋值.只能限制数据的类 ...

  9. ASP.Net Web中Repeater怎么删除指定行

    使用OnItemCommand事件 首先附上相关的代码 <asp:Repeater ID="Repeater1" runat="server" OnIte ...

  10. 钻进 Linux 内核看个究竟

    Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘? Linux 内核看不见摸不着,而对于这类东西,我们经常无从下手.本文就以浅显易懂的语言,带你钻进 Linux 内核, ...