程序的基本结构
包含的文件有:
common.h —— 一般的头文件,包含了常用的头文件,状态
c3-1.h —— 包含了基本操作的原型,类型定义
bo3-1.c —— 基本操作的实现
main3-1.c —— 测试各种操作
common.h中的内容
1 /* common.h (file name) */ 2 #include<string.h> 3 #include<ctype.h> 4 #include<malloc.h> 5 #include<limits.h> 6 #include<stdio.h> 7 #include<stdlib.h> 8 #include<math.h> 9 /* function result status code */ 10 #define TRUE 1 11 #define FALSE 0 12 #define OK 1 13 #define ERROR 0 14 #define INFEASIBLE -1 15 16 typedef int Status; /* function result status code, such as OK */ 17 typedef int Boolean; /* Boolean type, the value is TRUE or FALSE */
c3-1.h中的内容
1 /* c3-1.h 栈顺序存储结构 */ 2 3 #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */ 4 #define STACK_INCREMENT 2 /* 存储空间分配增量 */ 5 6 typedef int SElemType; /* 定义栈元素的类型 */ 7 8 struct _SqStack { 9 SElemType *base; /* 在栈构造之前和销毁之后, base的值为NULL */ 10 SElemType *top; /* 栈顶指针 */ 11 int stacksize; /* 当前已分配的存储空间, 以元素为单位 */ 12 }; /* 顺序栈 */ 13 14 typedef struct _SqStack SqStack; 15 16 /* 下面是和栈相关的9个操作 */ 17 18 /* 19 * 构造一个空栈, 栈顶和栈底的指针相同, 20 * 初始的长度为STACK_INIT_SIZE, 目前是10个栈元素 21 */ 22 void InitStack(SqStack *S); 23 24 /* 25 * 销毁一个已经存在的栈 26 */ 27 void DestroyStack(SqStack *S); 28 29 /* 30 * 把栈S置为空, 主要是将栈顶指针设为栈底指针 31 */ 32 void ClearStack(SqStack *S); 33 34 /* 35 * 判断栈是不是为空的 36 */ 37 Status StackEmpty(SqStack *S); 38 39 /* 40 * 返回S中元素的个数, 也就是栈的长度 41 */ 42 int StackLength(SqStack *S); 43 44 /* 45 * 返回栈顶的元素到e中, 但是不删除 46 */ 47 Status GetTop(SqStack *S, SElemType *e); 48 49 /* 50 * 向栈中插入元素 51 */ 52 void Push(SqStack *S, SElemType e); 53 54 /* 55 * 往栈顶插入一个元素 56 */ 57 void Push(SqStack *S, SElemType e); 58 59 /* 60 * 遍历栈的元素 61 */ 62 void StackTraverse(SqStack *S, void(*visit)(SElemType));
bo3-1.c中的内容
1 #include "common.h" 2 #include "c3-1.h" 3 /* bo3-1.c 顺序栈(存储结构在c3-1.h中定义)的基本操作(9个) */ 4 5 void InitStack(SqStack *S) { 6 /* 构造一个空栈 */ 7 if(!(S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)))) 8 exit(OVERFLOW); /* 存储分配失败 */ 9 S->top = S->base; 10 S->stacksize = STACK_INIT_SIZE; 11 } 12 13 14 void DestroyStack(SqStack *S) { 15 /* 销毁栈S, S不再存在 */ 16 free(S->base); 17 /* 除了释放资源还必须将元素置空或者置 */ 18 S->base = NULL; 19 S->top = NULL; 20 S->stacksize = 0; 21 } 22 23 void ClearStack(SqStack *S) { 24 /* 把S置为空栈, 并没有释放掉栈的空间, 而是移动栈顶指针为栈底 */ 25 S->top = S->base; 26 } 27 28 Status StackEmpty(SqStack *S) { 29 /* 判断栈是不是为空 */ 30 if(S->top == S->base) 31 return TRUE; 32 else 33 return FALSE; 34 } 35 36 int StackLength(SqStack *S) { 37 /* 返回栈S中元素的个数, 也就是栈的长度 */ 38 return S->top - S->base; 39 } 40 41 Status GetTop(SqStack *S, SElemType *e) { 42 /* 若栈不为空, 则用e返回S的栈顶元素, 并返回OK; 否则返回ERROR */ 43 if(S->top > S->base) { 44 *e = *(S->top - 1); 45 return OK; 46 } else { 47 return ERROR; 48 } 49 } 50 51 void Push(SqStack *S, SElemType e) { 52 /* 插入元素e为新的栈顶元素 */ 53 if(S->top - S->base >= S->stacksize) { 54 /* 这种情况下栈已经满了 */ 55 S->base = (SElemType *)realloc(S->base, (S->stacksize+STACK_INCREMENT) * 56 sizeof(SElemType)); 57 if(!S->base) 58 exit(OVERFLOW); /* 存储分配失败 */ 59 S->top = S->base + S->stacksize; 60 S->stacksize += STACK_INCREMENT; 61 } 62 *(S->top)++ = e; 63 } 64 65 Status Pop(SqStack *S, SElemType *e) { 66 /* 若栈不为空, 则删除栈顶元素, 用e返回其值, 并返回OK */ 67 /* 否则返回ERROR */ 68 if(S->top == S->base) 69 return ERROR; 70 *e = *--S->top; 71 return OK; 72 } 73 74 void StackTraverse(SqStack *S, void(*visit)(SElemType)) { 75 /* 从栈底到栈顶依次对栈中每个元素调用函数visit() */ 76 /* 这里要用一个变量保存栈底元素的指针 */ 77 SElemType *p = S->base; 78 while(S->top > S->base) 79 visit(*S->base++); 80 81 S->base = p; 82 }
main3-1.c中的内容
1 #include "common.h" 2 #include "c3-1.h" 3 4 void print(SElemType c) { 5 printf("%d ", c); 6 } 7 8 int main(void) { 9 int j; 10 SqStack s; 11 SElemType e; 12 InitStack(&s); /* 初始化一个栈 */ 13 14 for(j=1; j<=12; j++) 15 Push(&s, j); 16 17 printf("栈中的元素依次为: "); 18 StackTraverse(&s, print); 19 printf("\n"); 20 21 22 Pop(&s, &e); 23 printf("弹出的栈顶元素e=%d\n", e); 24 25 printf("栈是否为空: %d(1:空, 0:否)\n", StackEmpty(&s)); 26 27 GetTop(&s, &e); /* 获得栈顶元素, 但是并不弹出栈 */ 28 printf("栈顶元素 e=%d 栈的长度为%d\n", e, StackLength(&s)); 29 30 ClearStack(&s); 31 printf("清空栈后, 栈是否为空: %d(1:空 0:否)\n", StackEmpty(&s)); 32 33 DestroyStack(&s); 34 printf("销毁栈后, s.top=%u, s.base=%u, s.stacksize=%d\n",s.top, s.base, s.stacksize); 35 36 exit(0); 37 }
运行方法和结果显示
时间: 2024-10-27 11:31:33