栈的链式实现(C语言描述)

来源:互联网 发布:农行总行待遇 知乎 编辑:程序博客网 时间:2024/05/23 01:50

原文地址:http://blog.csdn.net/lpp0900320123/article/details/20615529            http://blog.csdn.net/ns_code/article/details/11358347

栈本质上是一个线性表,只不过对线性表的操作进行了限制,只可以在表的一端进行操作(插入、删除元素)。栈是一种是一种实现数据“先进后出”的存储结构,分为静态栈和动态栈,静态栈就是以数组的方式存储数据,动态栈是以链表的方式存储数据;对栈的操作算法,常用的就是压栈和出;下面将以链式的方式创建栈,并对用c语言实现栈的压栈和出栈的算法:

1.栈的创建

    在创建一个数据结构之前,必须知道这种数据结构由哪些参数组成,栈的本质既然是个链表,它必然由很多节点组成;为了实现“先进后出”这种数据结构,我们需要引进两个参数,一个是栈顶指针(pTop),始终指向栈顶元素。一个参数是栈底指针(pBottom),始终指向栈底元素。我们知道为了方便描述链表的各种操作,引进了头节点的概念,即为每个链表前面加一个头节点,但并存放有效数据;同样,为了实现栈的操作,我们同样需要一个不存放任何有效数据的节点,并且栈底指针始终指向该节点

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. typedef int elementype;  
  2. //定义一个节点  
  3. typedef struct Node  
  4. {  
  5.     elementype data;  
  6.     struct Node *pNext;  
  7. }NODE,*PNODE;//  
  8. //构造一个栈  
  9. typedef struct stack  
  10. {  
  11.     PNODE pTop; //栈顶指针  
  12.     PNODE pBottom;//栈底指针  
  13. }STACK,*PSTACK;  
其中,使用了typedef关键词,typedef只是给一个数据类型提供一个别名;因此这里的NODE=struct Node ,PNODE=struct Node *;同样,STACK=struct stack ,PSTACK=struct Node *;

此时,数据类型构造出来了,接下来要创建一个空栈,这样我们才能进行栈的操作,创建栈,无非就是分配内存,内存分配有三种方式,静态存储区,栈,堆;

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //创建一个空栈,里面没有任何有效数据;  
  2. void Create_Stack(PSTACK S)  
  3. {  
  4.     S->pBottom=(struct Node *)malloc(sizeof(struct Node));  
  5.     if(NULL==S->pBottom)  
  6.     {  
  7.         printf("Memory allocation failure");  
  8.         exit(-1);  
  9.     }  
  10.     S->pTop=S->pBottom;  
  11.     S->pTop->data=0;  
  12.     S->pTop->pNext=NULL;  //防止出现野指针  
  13. }  

图1 空栈示意图

2.压栈算法


图2 压栈算法示意图

压栈的伪算法:
(1).创建一个节点p,并修改节点的指针域使其指向栈顶数据元素;p->pNext=pTop;
(2)修改栈顶指针,使其指向栈顶元素,pTop=p;

程序代码:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //进栈  
  2. void Push_Stack(PSTACK S,int val)  
  3. {  
  4.     PNODE p=(struct Node *)malloc(sizeof(struct Node));  
  5.     if(NULL==p)  
  6.     {  
  7.         printf("Memory allocation failure");  
  8.         exit(-1);  
  9.     }  
  10.     p->data=val;  
  11.     p->pNext=S->pTop;  //让p的指针域指向上一个节点  
  12.     S->pTop=p;        //让pTop指针指向栈顶元素  
  13. }  

3.出栈算法


图3.出栈算法示意图

出栈伪算法:
(1).先用P指针保存要删除数据的地址,用于便于释放此节点的内存,即p=pTop;
(2).修改栈顶指针的指向,使其指向栈顶元素;pTop=pTop->pNext;

附录:程序代码

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4.   
  5.   
  6. typedef struct Node  
  7. {  
  8. int data;  
  9. struct Node *pNext;  
  10. }NODE,*PNODE;  
  11.   
  12.   
  13. typedef struct Stack  
  14. {  
  15. PNODE pTop;  
  16. PNODE pBottom;  
  17. }STACK,*PSTACK;  
  18.   
  19.   
  20. PSTACK create_stack();  
  21. void push_stack(PSTACK,int);  
  22. void traverse_stack(PSTACK);  
  23. bool pop_stack(PSTACK,int *);  
  24. bool is_empty(PSTACK);  
  25. void clear_stack(PSTACK);  
  26.   
  27.   
  28. int main()  
  29. {  
  30. int data_pop;  
  31. //创建一个空的栈,pS指针指向该栈  
  32. PSTACK pS = create_stack();  
  33.   
  34.   
  35. //向该栈中压入数据,遍历该栈并输出栈中的数据  
  36. push_stack(pS,2);  
  37. push_stack(pS,6);  
  38. push_stack(pS,28);  
  39. traverse_stack(pS);  
  40.   
  41.   
  42. //从该栈中推出数据,遍历该栈并输出栈中的数据  
  43. if(pop_stack(pS,&data_pop))  
  44.   printf("pop succeed,the data poped out is:%d\n",data_pop);  
  45. else   
  46.       printf("pop failed\n");  
  47. traverse_stack(pS);  
  48. //清空栈,遍历该栈并输出栈中的数据  
  49. clear_stack(pS);  
  50. printf("data cleared!\n");  
  51. traverse_stack(pS);  
  52.   
  53.   
  54. return 0;  
  55. }  
  56.   
  57.   
  58.   
  59.   
  60. //创建一个空栈,并返回指向该栈的指针  
  61.   
  62.   
  63. PSTACK create_stack()  
  64. {  
  65. PSTACK pS = (PSTACK)malloc(sizeof(STACK));  
  66. pS->pTop = (PNODE)malloc(sizeof(NODE));  
  67. if(NULL==pS || NULL==pS->pTop)  
  68. {  
  69.   printf("malloc failed");  
  70.   exit(-1);  
  71. }  
  72. else  
  73. {  
  74.   pS->pBottom = pS->pTop;  
  75.   pS->pBottom->pNext = NULL;  
  76. }  
  77. return pS;  
  78. }  
  79.   
  80.   
  81. //判断该栈是否为空  
  82.   
  83.   
  84. bool is_empty(PSTACK pS)  
  85. {  
  86. if(pS->pTop == pS->pBottom)  
  87.   return true;  
  88.     else  
  89.   return false;  
  90. }  
  91.   
  92.   
  93. //向pS指针指向的栈中压入数据val  
  94. void push_stack(PSTACK pS,int val)  
  95. {  
  96. PNODE pNew = (PNODE)malloc(sizeof(NODE));  
  97. if(NULL==pNew)  
  98. {  
  99.   printf("malloc failed");  
  100.   exit(-1);  
  101. }  
  102. else  
  103. {  
  104.   pNew->data = val;  
  105.   pNew->pNext = pS->pTop;  
  106.   pS->pTop = pNew;  
  107. }  
  108. return ;  
  109. }  
  110.   
  111.   
  112. //从栈中推出数据,并将推出的数据保存在pData指针所指向的位置  
  113. bool pop_stack(PSTACK pS,int *pData)  
  114. {  
  115. if(is_empty(pS))  
  116.   return false;  
  117. else  
  118. {  
  119.   PNODE p = pS->pTop;  
  120.   *pData = p->data;  
  121.   pS->pTop = p->pNext;  
  122.   free(p);  
  123.   p = NULL;  
  124.   return true;  
  125. }  
  126. }  
  127.   
  128.   
  129. //遍历栈,并自栈顶向栈底输出栈中的数据  
  130. void traverse_stack(PSTACK pS)  
  131. {  
  132. PNODE pCurrent = pS->pTop;   
  133. printf("Now datas int the stack are:\n");  
  134. while(pCurrent != pS->pBottom)  
  135.         {  
  136.   printf("%d ",pCurrent->data);  
  137.   pCurrent = pCurrent->pNext;  
  138. }  
  139. printf("\n");  
  140. return ;  
  141. }  
  142.   
  143.   
  144. //清空栈,即将其还原为空栈  
  145. void clear_stack(PSTACK pS)  
  146. {  
  147.   if(is_empty(pS))  
  148.     return ;  
  149.   PNODE p = NULL;  
  150.   while(pS->pTop != pS->pBottom)  
  151.   {  
  152.      p = pS->pTop;
  153.      pS->pTop = p->pNext;
  154.      free(p);  
  155.        p = NULL;
  156.   }  
  157. }  

0 0
原创粉丝点击