1 #include <cstdio>
2 #include <cstdlib>
3 //顺序栈 Freeze 2010 10 6
4 #define ADDSIZE 5 //栈分配存储空间分配增量
5 typedef int SElemType;
6
7 typedef struct {
8 SElemType *base; //存储空间基指针;
9 SElemType *top; //栈顶指点针
10 int size; //长度,默认为0
11 int capacity; //容量
12 }SqStack;
13
14
15 void initStack(SqStack &S); //构造一个空栈S,此处为引用
16 void freeStack(SqStack &S); //若栈已存在,销毁栈S,此处为引用
17 void clearStack(SqStack &S); //清空栈,此处为引用
18 bool isEmpty(const SqStack S); //若栈S为空,则返回ture,否则返回false
19 void addCapacity(SqStack &S); //增加栈容量,此处为引用
20 SElemType get(const SqStack S); //返回栈顶元素
21 void push(SqStack &S,SElemType e); //入栈,此处为引用
22 SElemType pop(SqStack &S); //出栈,此处为引用
23
24
25 //构造一个空栈S
26 void initStack(SqStack &S)
27 {
28 S.base=(SElemType *)malloc(ADDSIZE*sizeof(SElemType));
29 if(!S.base)
30 {
31 printf("内存不足\n");
32 exit(1);
33 }
34 S.top=S.base;
35 S.size=0;
36 S.capacity=ADDSIZE;
37 }
38
39 //销毁栈S
40 void freeStack(SqStack &S)
41 {
42 if (S.capacity>0)
43 {
44 free(S.base);
45 }
46 }
47
48 //清空栈
49 void clearStack(SqStack &S)
50 {
51 if (!isEmpty(S))
52 {
53 S.top=S.base;
54 }
55 }
56
57 //若栈S为空,则返回ture,否则返回false
58 bool isEmpty(const SqStack S)
59 {
60 return(S.size==0);
61 }
62
63 //返回栈顶元素 若栈为空,则报错
64 SElemType get(const SqStack S)
65 {
66 if (!isEmpty(S))
67 return *S.top;
68 else{
69 printf("空栈,无法入栈!\n");
70 exit(1);
71 }
72 }
73
74 //插入元素e成为新的栈顶元素
75 void push(SqStack &S,SElemType e)
76 {
77
78 if (S.size>=S.capacity) { //栈满,追加存储空间
79 addCapacity(S);
80 }
81
82 if (S.size==0)
83 {
84 (*S.top)=e;
85 }
86 else
87 {
88
89 S.top+=1;
90 (*S.top)=e;
91 }
92 S.size++;
93 }
94
95 //出栈
96 SElemType pop(SqStack &S)
97 {
98 if (isEmpty(S)){
99 printf("空栈,无法出栈!\n");
100 exit(1);
101 }else{
102 S.size--;
103 S.top-=1;
104 return *(S.top+1);
105 }
106 }
107 //增加栈容量
108 void addCapacity(SqStack &S){
109 SElemType *temp=(SElemType *)realloc(S.base,(S.capacity+ADDSIZE)*sizeof(SElemType));
110 if(!temp)
111 {
112 printf("无法增加容量,内存不足\n");
113 exit(1);
114 }else{
115 if (!(temp==S.base))
116 {
117 S.base=temp;
118 S.top=S.base+S.capacity-1;
119 }
120 S.capacity+=ADDSIZE;
121 }
122 }