栈
1 #include <stdio.h>
2 #include <string.h>
3 #include <malloc.h>
4 #include <stdlib.h>
5
6 #define OVERFLOW 0
7 #define TRUE true
8 #define FALSE false
9 #define OK 1
10 #define ERROR 0
11
12 #define STACK_INIT_SIZE 10 //存储空间初始分配量
13 #define STACK_INCREMENT 2 //存储空间分配增量
14
15 typedef int SElemType;
16 typedef bool Status;
17
18 //栈的顺序存储表示
19
20 typedef struct SqStack{
21 SElemType *base; //在栈构造之前和销毁之后,base的值为NULL
22 SElemType *top; //栈顶指针
23 int stacksize; //当前已分配的存储空间,以元素为单位
24 }SqStack; //顺序栈
25
26 //构造一个空栈S
27 void InitStack(SqStack *S){
28 (*S).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
29 if(!(*S).base){
30 exit(OVERFLOW); //存储分配失败
31 }
32 (*S).top = (*S).base;
33 (*S).stacksize = STACK_INIT_SIZE;
34 }
35
36 //销毁栈S,S不再存在
37 void DestroyStack(SqStack *S){
38 free((*S).base);
39 (*S).base = NULL;
40 (*S).top = NULL;
41 (*S).stacksize = 0;
42 }
43
44 //若栈S为空栈,则返回TRUE,否则返回FALSE
45 Status StackEmpty(SqStack S){
46 if(S.top == S.base){
47 return TRUE;
48 }
49 else{
50 return FALSE;
51 }
52 }
53
54 //若栈不为空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
55 Status GetTop(SqStack S, SElemType *e){
56 if(S.top > S.base){
57 *e = *(S.top - 1);
58 return OK;
59 }
60 else{
61 return ERROR;
62 }
63 }
64
65 //插入元素e为新的栈顶元素
66 void Push(SqStack *S, SElemType e){
67 if((*S).top - (*S).base >= (*S).stacksize){ //栈满,增加存储空间
68 (*S).base - (SElemType *)realloc((*S).base, ((*S).stacksize + STACK_INCREMENT) * sizeof(SElemType));
69 if(!(*S).base){
70 exit(OVERFLOW); //存储空间分配失败
71 }
72 (*S).top = (*S).base + (*S).stacksize;
73 (*S).stacksize += STACK_INCREMENT;
74 }
75 *((*S).top)++=e;
76 }
77
78 //若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK。否则返回ERROR
79 Status Pop(SqStack *S, SElemType *e){
80 if((*S).top == (*S).base){
81 return ERROR;
82 }
83 *e = *--(*S).top;
84 return OK;
85 }
86
87 int main(){
88 return 0;
89 }
2 #include <string.h>
3 #include <malloc.h>
4 #include <stdlib.h>
5
6 #define OVERFLOW 0
7 #define TRUE true
8 #define FALSE false
9 #define OK 1
10 #define ERROR 0
11
12 #define STACK_INIT_SIZE 10 //存储空间初始分配量
13 #define STACK_INCREMENT 2 //存储空间分配增量
14
15 typedef int SElemType;
16 typedef bool Status;
17
18 //栈的顺序存储表示
19
20 typedef struct SqStack{
21 SElemType *base; //在栈构造之前和销毁之后,base的值为NULL
22 SElemType *top; //栈顶指针
23 int stacksize; //当前已分配的存储空间,以元素为单位
24 }SqStack; //顺序栈
25
26 //构造一个空栈S
27 void InitStack(SqStack *S){
28 (*S).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
29 if(!(*S).base){
30 exit(OVERFLOW); //存储分配失败
31 }
32 (*S).top = (*S).base;
33 (*S).stacksize = STACK_INIT_SIZE;
34 }
35
36 //销毁栈S,S不再存在
37 void DestroyStack(SqStack *S){
38 free((*S).base);
39 (*S).base = NULL;
40 (*S).top = NULL;
41 (*S).stacksize = 0;
42 }
43
44 //若栈S为空栈,则返回TRUE,否则返回FALSE
45 Status StackEmpty(SqStack S){
46 if(S.top == S.base){
47 return TRUE;
48 }
49 else{
50 return FALSE;
51 }
52 }
53
54 //若栈不为空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
55 Status GetTop(SqStack S, SElemType *e){
56 if(S.top > S.base){
57 *e = *(S.top - 1);
58 return OK;
59 }
60 else{
61 return ERROR;
62 }
63 }
64
65 //插入元素e为新的栈顶元素
66 void Push(SqStack *S, SElemType e){
67 if((*S).top - (*S).base >= (*S).stacksize){ //栈满,增加存储空间
68 (*S).base - (SElemType *)realloc((*S).base, ((*S).stacksize + STACK_INCREMENT) * sizeof(SElemType));
69 if(!(*S).base){
70 exit(OVERFLOW); //存储空间分配失败
71 }
72 (*S).top = (*S).base + (*S).stacksize;
73 (*S).stacksize += STACK_INCREMENT;
74 }
75 *((*S).top)++=e;
76 }
77
78 //若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK。否则返回ERROR
79 Status Pop(SqStack *S, SElemType *e){
80 if((*S).top == (*S).base){
81 return ERROR;
82 }
83 *e = *--(*S).top;
84 return OK;
85 }
86
87 int main(){
88 return 0;
89 }