1. 引言
本文主要讲解顺序栈和链式栈。
2. 顺序栈
//栈的顺序存储结构和其基本操作 #include "ds.h" #define STACK_INIT_SIZE 10 // 存储空间初始分配量 #define STACK_INCREMENT 2 // 存储空间分配增量 typedef int SElemType; typedef struct SqStack { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }SqStack; void InitStack(SqStack &S); void DestroyStack(SqStack &S); void ClearStack(SqStack &S); Status StackEmpty(SqStack S); int StackLength(SqStack S); Status GetTop(SqStack S, SElemType &e); void Push(SqStack &S, SElemType e); Status Pop(SqStack &S, SElemType &e); void StackTraverse(SqStack S, void(* visit)(SElemType)); // 构造一个空栈S void InitStack(SqStack &S) { S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; } // 销毁栈S,S不再存在 void DestroyStack(SqStack &S) { free(S.base); S.base = NULL; S.top = NULL; S.stacksize = 0; } // 把S置为空栈 void ClearStack(SqStack &S) { S.top = S.base; } // 若栈S为空栈,则返回TRUE,否则返回FALSE Status StackEmpty(SqStack S) { if (S.top == S.base) return TRUE; else return FALSE; } // 返回S的元素个数,即栈的长度 int StackLength(SqStack S) { return S.top - S.base; // not return S.stacksize; } // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR Status GetTop(SqStack S, SElemType &e) { if (S.top > S.base) { memcpy(&e, S.top - 1, sizeof(SElemType)); return OK; } else { return ERROR; } } // 插入元素e为新的栈顶元素 void Push(SqStack &S, SElemType e) { if (S.top - S.base >= S.stacksize) { S.base = (SElemType*)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACK_INCREMENT; } memcpy(S.top, &e, sizeof(SElemType)); S.top++; } // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR Status Pop(SqStack &S, SElemType &e) { if (S.top == S.base) return ERROR; memcpy(&e, --S.top, sizeof(SElemType)); return OK; } // 从栈底到栈顶依次对栈中每个元素调用函数visit() void StackTraverse(SqStack S, void(* visit)(SElemType)) { SElemType *p = S.base; while(p < S.top) { visit(*p++); } printf("\n"); } void print(SElemType c) { printf("%d ",c); } int main() { int j; SqStack s; SElemType e; InitStack(s); for(j=1;j<=12;j++) Push(s,j); printf("栈中元素依次为:"); StackTraverse(s,print); Pop(s,e); printf("弹出的栈顶元素 e=%d\n",e); printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s)); GetTop(s,e); printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s)); ClearStack(s); printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s)); DestroyStack(s); printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top, s.base, s.stacksize); }
3. 链式栈
#include "ds.h" typedef int SElemType; typedef struct SNode { SElemType data; SNode *next; }SNode; typedef struct{ SNode *top; } LinkStack; void InitStack(LinkStack &S); void DestroyStack(LinkStack &S); void ClearStack(LinkStack &S); int StackEmpty(LinkStack S); int StackLength(LinkStack S); Status GetTop(LinkStack S, SElemType &e); Status Push(LinkStack &S, SElemType e); Status Pop(LinkStack &S, SElemType &e); void StackTraverse(LinkStack S, void(* visit)(SElemType)); // 初始化栈 void InitStack(LinkStack &S) { S.top = NULL; } // 销毁栈 void DestroyStack(LinkStack &S) { SNode *p = S.top, *q; while (p) { q = p->next; free(p); p = q; } S.top = NULL; } void ClearStack(LinkStack &S) { DestroyStack(S); } int StackEmpty(LinkStack S) { if (S.top) return FALSE; else return TRUE; } // 求栈的长度 int StackLength(LinkStack S) { int len = 0; SNode *p = S.top; while(p) { len++; p = p->next; } return len; } // 取栈顶元素 Status GetTop(LinkStack S, SElemType &e) { if (!S.top) return ERROR; memcpy(&e, &(S.top->data), sizeof(SElemType)); return OK; } // 入栈 Status Push(LinkStack &S, SElemType e) { SNode *s = (SNode*)malloc(sizeof(SNode)); if (!s) exit(OVERFLOW); memcpy(&(s->data), &e, sizeof(SElemType)); s->next = S.top; S.top = s; return OK; } // 出栈 Status Pop(LinkStack &S, SElemType &e) { SNode *p = S.top; if (!p) return FALSE; memcpy(&e, &(p->data), sizeof(SElemType)); S.top = p->next; free(p); p = NULL; return TRUE; } // 遍历栈 void StackTraverse(LinkStack S, void(* visit)(SElemType)) { SNode *p = S.top; while (p) { visit(p->data); p = p->next; } printf("\n"); } void print(SElemType e) { printf("%d ", e); } int main() { int j; LinkStack s; SElemType e; InitStack(s); // 初始化栈s for(j=1;j<=5;j++) // 将2,4,6,8,10入栈 Push(s,2*j); printf("栈中的元素从栈底到栈顶依次为: "); StackTraverse(s,print); Pop(s,e); printf("弹出的栈顶元素为%d\n",e); printf("栈空否: %d(1:空 0:否)\n",StackEmpty(s)); GetTop(s,e); printf("当前栈顶元素为%d,栈的长度为%d\n",e,StackLength(s)); ClearStack(s); printf("清空栈后,栈空否: %d(1:空 0:否),栈的长度为%d\n",StackEmpty(s),StackLength(s)); DestroyStack(s); }