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("栈为空,无法得到栈顶元素\n");
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("\n遍历前:");
133 stackTraverse(&S,visit);
134 int i;
135 for(i=1;i<=1;i++)
136 pop(&S,&e);
137 printf("\n弹出%d个元素后:",i-1);
138 stackTraverse(&S,visit);
139 getTop(&S,&e);
140 printf("\n栈顶元素为:%d",e);
141 clearStack(&S);
142 if(emptyStack(&S))
143 printf("\n栈变为空栈了");
144 system("pause");
145 return 0;
146 }