1
/**//*========================顺序栈的实现===================================*/
2
#include <stdio.h>
3
#include <malloc.h>
4
5
#define STACK_INIT_SIZE 100
6
#define STACKINCREMENT 10
7
8
typedef struct
{ /**//*顺序栈的类型定义*/
9
char *base;
10
char *top;
11
int stacksize;
12
}sqstack;
13
14
15
16
int visit(char p)
{
17
if(p>=65&&p<=97)/**//*-----visit函数用与栈的遍历调用,判断一个字母是否是大写字母-----------*/
18
return 1;
19
else
20
return 0;
21
}
22
23
24
void 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
41
int 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
51
int destroystack(sqstack *s)
{ /**//*----------销毁栈-----------*/
52
free(s->base);
53
} /**//*?????????????????destroystack与 clearstack的区别????????????????????*/
54
55
int clearstack(sqstack*s)
{ /**//*----------清空栈-----------*/
56
s->top=s->base;
57
}
58
59
60
61
int stackempty(sqstack s)
{ /**//*----若空则返回 1 -------算法4*/
62
if(s.top==s.base) return 1;
63
else return 0;
64
}
65
66
67
68
int 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
82
char gettop(sqstack s)
{ /**//*----------用e返回栈顶元素的值-----------*/
83
if(stackempty(s)) return 0;
84
return *(s.top-1);
85
}
86
87
88
89
int push(sqstack *s,char e)
{ /**//*---------压栈------------*/
90
/**//*若栈满,追加存储空间*/
91
*(s->top++)=e;
92
s->stacksize++;
93
}
94
95
96
97
98
int 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
107
int 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
124
main()
{
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
/**//*----------stacklength(sa)-----------*/
141
printf("There are %d elements in this stack\n",stacklength(sa));
142
143
144
if(stacktraverse(*sa)) printf("dou shi da xie zi mu\n");
145
else printf("wu da xie zi mu\n");
146
147
148
k=&elem2;
149
pop(sa,k); /**//*---------------------算法8*/
150
printf("After pop ,");
151
print(stack);
152
printf("There are %d elements in this stack\n",stacklength(sa));
153
154
155
getch();
156
}
157
158
159
160
161
162
163


2

3

4

5

6

7

8



9

10

11

12

13

14

15

16



17


18

19

20

21

22

23

24



25

26

27

28

29



30

31

32

33

34

35

36

37


38


39


40

41



42


43

44

45


46

47

48

49

50

51



52

53


54

55



56

57

58

59

60

61



62

63

64

65

66

67

68



69

70

71

72

73



74

75

76

77

78

79

80

81

82



83

84

85

86

87

88

89



90


91

92

93

94

95

96

97

98



99

100

101

102

103

104

105

106

107



108

109

110



111

112

113

114

115

116

117

118

119

120


121

122

123

124



125

126

127

128

129

130

131


132



133


134

135

136

137


138

139

140


141

142

143

144

145

146

147

148

149


150

151

152

153

154

155

156

157

158

159

160

161

162

163
