Chinaunix首页 | 论坛 | 博客
  • 博客访问: 475540
  • 博文数量: 111
  • 博客积分: 3146
  • 博客等级: 中校
  • 技术积分: 939
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-07 11:23
个人简介

Nathing

文章分类

全部博文(111)

文章存档

2016年(2)

2015年(1)

2014年(31)

2012年(2)

2011年(9)

2010年(36)

2009年(30)

我的朋友

分类: C/C++

2014-07-25 09:32:42


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>

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

  9. typedef struct Stack
  10. {
  11.     PNODE pTop;
  12.     PNODE pBottom;
  13. }STACK, *PSTACK;

  14. void initStack(PSTACK);
  15. void push(PSTACK, int);
  16. void traverseStack(PSTACK);
  17. bool popStack(PSTACK, int *);
  18. bool isEmpty(PSTACK);
  19. void clearStack(PSTACK);

  20. int main()
  21. {
  22.     STACK s;
  23.     int val;
  24.     initStack(&s);
  25.     push(&s, 2);
  26.     push(&s, 3);
  27.     push(&s, 4);
  28.     push(&s, 5);
  29.     traverseStack(&s);
  30.     popStack(&s, &val);
  31.     printf("\npopStack value is %d \n", val);
  32.     traverseStack(&s);
  33.     printf("\n");
  34.     clearStack(&s);
  35.     traverseStack(&s);

  36.     return 0;
  37. }

  38. /**
  39.  * 初始化空栈思路:
  40.  *
  41.  * 创建一个空结点,让pTop和pBottom都指向它
  42.  * 并清空空结点的指针域
  43.  *
  44. **/
  45. void initStack(PSTACK pS)
  46. {
  47.     //创建一个空结点,让pTop指向它
  48.     pS->pTop = (PNODE)malloc(sizeof(PNODE));
  49.     if (NULL != pS->pTop)
  50.     {
  51.         //将pBottom也指向空节点
  52.         pS->pBottom = pS->pTop;
  53.         //清空空结点的指针域
  54.         pS->pTop->pNext = NULL;
  55.     }
  56.     else
  57.     {
  58.         printf("内存分配失败!程序退出!\n");
  59.         exit(-1);
  60.     }
  61. }

  62. /**
  63.  * 压栈思路:
  64.  *
  65.  * 创建一个新结点,将新结点的指针域指向之前建的空节点,再将pTop指向新的结点
  66.  * 相当于在pTop和之前的空节点之间插入这个新节点(在压第一个元素时,这么理解)
  67.  * 通用说法是在pTop和栈顶元素之间插入这个新节点
  68.  *
  69. **/
  70. void push(PSTACK pS, int val)
  71. {
  72.     PNODE pNew = (PNODE)malloc(sizeof(PNODE));
  73.     if (NULL != pNew)
  74.     {
  75.         pNew->data = val;
  76.         pNew->pNext = pS->pTop;
  77.         //重新设置pTop,将pTop指向新的结点
  78.         pS->pTop = pNew;
  79.     }
  80.     else
  81.     {
  82.         printf("内存分配失败!程序退出!\n");
  83.         exit(-1);
  84.     }

  85. }

  86. /**
  87.  * 遍历栈思路:
  88.  *
  89.  * 在遍历栈的时候不能更改栈的内部指向,所以将栈顶赋给一个临时结点
  90.  *
  91. **/
  92. void traverseStack(PSTACK pS)
  93. {
  94.     PNODE pNode = pS->pTop;
  95.     while (pNode != pS->pBottom)
  96.     {
  97.         printf("%d ",pNode->data);
  98.         pNode = pNode->pNext;
  99.     }
  100.     return;
  101. }

  102. bool isEmpty(PSTACK pS)
  103. {
  104.     if(pS->pTop == pS->pBottom)
  105.         return true;
  106.     else
  107.         return false;
  108. }

  109. /**
  110.  * 出栈思路:
  111.  *
  112.  * 先保存栈顶元素的地址,然后将pTop指向下一元素,最后释放之前栈顶元素的内存
  113.  * 相当于删除栈顶元素
  114.  *
  115. **/
  116. bool popStack(PSTACK pS, int * pVal)
  117. {
  118.     if (isEmpty(pS))
  119.     {
  120.         return false;
  121.     }
  122.     else
  123.     {
  124.         PNODE pNode = pS->pTop;
  125.         *pVal = pNode->data;
  126.         pS->pTop = pNode->pNext;
  127.         free(pNode);
  128.         pNode = NULL;

  129.         return true;
  130.     }

  131. }

  132. /**
  133.  * 清空栈思路:
  134.  *
  135.  * 使用两个结点指针变量用来释放栈中元素的内存
  136.  * 最后将栈顶指向栈底(此时栈底元素还是指向initStack时创建的空节点)
  137.  *
  138. **/
  139. void clearStack(PSTACK pS)
  140. {
  141.     if (isEmpty(pS))
  142.     {
  143.         return;
  144.     }
  145.     else
  146.     {
  147.         PNODE p = pS->pTop;
  148.         PNODE q = NULL;
  149.         while(p != pS->pBottom)
  150.         {
  151.             q = p->pNext;
  152.             free(p);
  153.             p = q;
  154.         }
  155.         //将栈顶指向栈底(此时栈底元素还是指向initStack时创建的空节点)
  156.         pS->pTop = pS->pBottom;

  157.         return;
  158.     }

  159. }

阅读(773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~