首页 > 代码库 > 用数组实现栈结构

用数组实现栈结构

程序的基本结构

包含的文件有:

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 }

 运行方法和结果显示

技术分享

 

用数组实现栈结构