栈的链式存储方法的C语言实现

  1 /*
  2   编译器:Dev-c++ 5.4.0 
  3   文件名:linkStack.cpp 
  4   代码版本号:1.0
  5   时间:2015年10月15日18:56:06
  6 
  7 */
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #define ERROR 0
 11 #define OK 1
 12 #define FALSE 0
 13 #define TRUE 1
 14 #define OVERFLOW -2
 15 
 16 typedef int sElemType; 
 17 typedef int Status;  
 18 typedef struct lNode{
 19     sElemType data;
 20     struct lNode *next;
 21 }lNode,*linkStack;
 22 
 23 
 24 /*初始化空栈*/ 
 25 Status initStack(linkStack *s){
 26     *s=(linkStack)malloc(sizeof(lNode));
 27     if(!(*s))
 28         exit(OVERFLOW);
 29     (*s)->next=NULL;
 30     return OK; 
 31 }
 32 
 33 /*销毁栈*/
 34 Status destroyStack(linkStack *s){
 35     lNode *p=(*s)->next;
 36     lNode *q;
 37     if(!p){
 38         return OK; 
 39     }
 40     while(p){
 41         q=p;
 42         p=p->next;
 43         free(q);
 44     }
 45     return OK;
 46 }
 47 
 48 /*把S栈置为空栈*/
 49 Status clearStack(linkStack *s){
 50     (*s)->next=NULL; 
 51     return OK;
 52 }
 53 
 54 /*判断栈是否为空栈*/
 55 bool emptyStack(linkStack *s){
 56     if((*s)->next)
 57         return FALSE;
 58     else
 59         return TRUE;
 60 } 
 61 
 62 int stackLength(linkStack *s){
 63     int len=0;
 64     *s=(*s)->next;
 65     while(*s){
 66         *s=(*s)->next;
 67         len++;
 68     }
 69     return len;
 70 }
 71 /*入栈*/ 
 72 Status push(linkStack *s,sElemType e){
 73     lNode *p=(*s);
 74     while(p->next){
 75         p=p->next;
 76     }
 77     p->next=(linkStack)malloc(sizeof(lNode));
 78     p->next->data=e;
 79     p->next->next=NULL;
 80     return OK;
 81 }
 82 
 83 /*出栈*/ 
 84 Status pop(linkStack *s,sElemType *e){
 85     lNode *p=(*s);
 86     lNode *q; 
 87     while(p->next){
 88         q=p;
 89         p=p->next;
 90     }
 91     q->next=NULL;
 92     *e=p->data; 
 93     free(p);
 94     return OK;
 95 } 
 96 
 97 /*得到栈顶元素*/
 98 Status getTop(linkStack *s,sElemType *e){
 99     lNode *p=(*s);
100     if(!p->next){
101         printf("栈为空,无法得到栈顶元素
");
102         return ERROR;    
103     }
104     
105     while(p->next){
106         p=p->next;
107     }
108     *e=p->data;
109     return OK;
110 } 
111 
112 int visit(sElemType c){
113     printf("%d ",c);
114     return 1;
115 }
116 /*遍历栈*/
117 Status stackTraverse(linkStack *s,int (*visit)(sElemType)){
118     linkStack p=(*s)->next; 
119     while(p){
120         visit(p->data);
121         p=p->next;
122     }
123     return OK;
124 }
125 
126 int main(){
127     linkStack S;
128     initStack(&S);
129     sElemType e;
130     for(e=1;e<=5;e++)
131         push(&S,e); 
132     printf("
遍历前:");
133     stackTraverse(&S,visit);
134     int i;
135     for(i=1;i<=1;i++)
136         pop(&S,&e);
137     printf("
弹出%d个元素后:",i-1);
138     stackTraverse(&S,visit);
139     getTop(&S,&e);
140     printf("
栈顶元素为:%d",e);
141     clearStack(&S);
142     if(emptyStack(&S))
143         printf("
栈变为空栈了"); 
144     system("pause");
145     return 0;
146 }
原文地址:https://www.cnblogs.com/gangtiexia/p/4883384.html