1/*========================顺序栈的实现===================================*/
2#include <stdio.h>
3#include <malloc.h>
4
5#define STACK_INIT_SIZE 100
6#define STACKINCREMENT 10
7
8typedef struct{ /*顺序栈的类型定义*/
9 char *base;
10 char *top;
11 int stacksize;
12}sqstack;
13
14
15
16int visit(char p){
17 if(p>=65&&p<=97)/*-----visit函数用与栈的遍历调用,判断一个字母是否是大写字母-----------*/
18 return 1;
19 else
20 return 0;
21}
22
23
24void print(sqstack s){ /*----依次输出栈中元素的函数-----*/
25 char *p,*q;
26 p=s.top;
27 q=s.base;
28 printf("The stack :");
29 while(p!=q){
30 printf("%c ",*(p-1));
31 p--;
32 }
33 printf("\n");
34}
35
36
37/*==========================================================================*/
38/*==========================对栈进行的操作==========================*/
39/*==========================================================================*/
40
41int initstack(sqstack *s){ /*------构造一个空栈----*/
42 s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char)); /*--成员运算符的优先级高于指针运算符---*/
43 s->base=s->top;
44 if(!s->base) return 0;
45 s->stacksize=STACK_INIT_SIZE;/*=====顺序栈,初值不为0=====*/
46 return 1;
47}
48
49
50
51int destroystack(sqstack *s){ /*----------销毁栈-----------*/
52 free(s->base);
53} /*?????????????????destroystack与 clearstack的区别????????????????????*/
54
55int clearstack(sqstack*s){ /*----------清空栈-----------*/
56 s->top=s->base;
57}
58
59
60
61int stackempty(sqstack s){ /*----若空则返回 1 -------算法4*/
62 if(s.top==s.base) return 1;
63 else return 0;
64}
65
66
67
68int stacklength(sqstack *s){ /*----------返回栈的元素个数----------*/
69 int i=0;
70 char *p,*q;
71 p=s->top;
72 q=s->base;
73 while(p!=q){
74 i++;
75 p--;
76 }
77 return i;
78}
79
80
81
82char gettop(sqstack s){ /*----------用e返回栈顶元素的值-----------*/
83 if(stackempty(s)) return 0;
84 return *(s.top-1);
85}
86
87
88
89int push(sqstack *s,char e){ /*---------压栈------------*/
90 /*若栈满,追加存储空间*/
91 *(s->top++)=e;
92 s->stacksize++;
93}
94
95
96
97
98int pop(sqstack *s,char *e){ /*---------若栈顶不为空,则删除栈顶元素------------*/
99 if(s->top==s->base) return 0;
100 *e=*(--s->top);
101 return 1;
102}
103
104
105
106
107int stacktraverse(sqstack s){ /*---------遍历一个栈------------*/
108 char *p;
109 p=s.top;
110 while(p!=s.base){
111 if(visit(!*p)) return 0;
112 p--;
113 }
114 return 1;
115}
116
117
118
119
120/*========================主函数部分=====================================*/
121
122
123
124main(){
125 int i;
126 char *k=NULL,a='A',elem1,elem2;
127
128 sqstack *sa=NULL,stack;
129 sa=&stack;
130
131 initstack(sa);/*-------调用构造函数构造一个sa指向的空栈---------*/
132 for(i=1;i<=10;i++){
133 push(sa,a++);/*---------循环调用压栈函数向栈中压入10个元素------------*/
134 }
135 print(stack);
136
137 /*----------gettop(*sa,&elem1)-----------*/
138 printf("The top elem of stack:%c \n",elem1=gettop(stack));
139
140
2#include <stdio.h>
3#include <malloc.h>
4
5#define STACK_INIT_SIZE 100
6#define STACKINCREMENT 10
7
8typedef struct{ /*顺序栈的类型定义*/
9 char *base;
10 char *top;
11 int stacksize;
12}sqstack;
13
14
15
16int visit(char p){
17 if(p>=65&&p<=97)/*-----visit函数用与栈的遍历调用,判断一个字母是否是大写字母-----------*/
18 return 1;
19 else
20 return 0;
21}
22
23
24void print(sqstack s){ /*----依次输出栈中元素的函数-----*/
25 char *p,*q;
26 p=s.top;
27 q=s.base;
28 printf("The stack :");
29 while(p!=q){
30 printf("%c ",*(p-1));
31 p--;
32 }
33 printf("\n");
34}
35
36
37/*==========================================================================*/
38/*==========================对栈进行的操作==========================*/
39/*==========================================================================*/
40
41int initstack(sqstack *s){ /*------构造一个空栈----*/
42 s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char)); /*--成员运算符的优先级高于指针运算符---*/
43 s->base=s->top;
44 if(!s->base) return 0;
45 s->stacksize=STACK_INIT_SIZE;/*=====顺序栈,初值不为0=====*/
46 return 1;
47}
48
49
50
51int destroystack(sqstack *s){ /*----------销毁栈-----------*/
52 free(s->base);
53} /*?????????????????destroystack与 clearstack的区别????????????????????*/
54
55int clearstack(sqstack*s){ /*----------清空栈-----------*/
56 s->top=s->base;
57}
58
59
60
61int stackempty(sqstack s){ /*----若空则返回 1 -------算法4*/
62 if(s.top==s.base) return 1;
63 else return 0;
64}
65
66
67
68int stacklength(sqstack *s){ /*----------返回栈的元素个数----------*/
69 int i=0;
70 char *p,*q;
71 p=s->top;
72 q=s->base;
73 while(p!=q){
74 i++;
75 p--;
76 }
77 return i;
78}
79
80
81
82char gettop(sqstack s){ /*----------用e返回栈顶元素的值-----------*/
83 if(stackempty(s)) return 0;
84 return *(s.top-1);
85}
86
87
88
89int push(sqstack *s,char e){ /*---------压栈------------*/
90 /*若栈满,追加存储空间*/
91 *(s->top++)=e;
92 s->stacksize++;
93}
94
95
96
97
98int pop(sqstack *s,char *e){ /*---------若栈顶不为空,则删除栈顶元素------------*/
99 if(s->top==s->base) return 0;
100 *e=*(--s->top);
101 return 1;
102}
103
104
105
106
107int stacktraverse(sqstack s){ /*---------遍历一个栈------------*/
108 char *p;
109 p=s.top;
110 while(p!=s.base){
111 if(visit(!*p)) return 0;
112 p--;
113 }
114 return 1;
115}
116
117
118
119
120/*========================主函数部分=====================================*/
121
122
123
124main(){
125 int i;
126 char *k=NULL,a='A',elem1,elem2;
127
128 sqstack *sa=NULL,stack;
129 sa=&stack;
130
131 initstack(sa);/*-------调用构造函数构造一个sa指向的空栈---------*/
132 for(i=1;i<=10;i++){
133 push(sa,a++);/*---------循环调用压栈函数向栈中压入10个元素------------*/
134 }
135 print(stack);
136
137 /*----------gettop(*sa,&elem1)-----------*/
138 printf("The top elem of stack:%c \n",elem1=gettop(stack));
139
140