栈的实现 (数据结构 严蔚敏 清华大学出版社 第三章 抽象数据类型 成功编译并运行)
2016-10-27 16:40
351 查看
栈的实现
栈的操作: //主函数 main.cpp #include "header.h" #define N 20 Status visit(ElemType c) { printf("%d ", c); return OK; } int main(void ) { int j; SqStack s; ElemType e; if(InitStack(&s)) { for(j=1; j<=N; j++) { Push(&s, j); } } printf("Output stack elements:"); StackTraverse(s,visit); Pop(&s,&e); printf("Pop element e=%d\n",e); printf("Is stack empty:%d(1:Y 0:N)\n",StackEmpty(s)); GetTop(s,&e); printf("Top element:e=%d Stack length:%d\n",e,StackLength(s)); ClearStack(&s); printf("After destroying stack, is stack empty:%d(1:Y 0:N )\n",StackEmpty(s)); DestroyStack(&s); printf("After destroying stack, s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize); } // StackFunc.cpp // Created by Cooper on 23/10/2016. // #include "header.h" #ifndef STACK_STACKFUNC_CPP #define STACK_STACKFUNC_CPP /* 顺序栈(存储结构由c3-1.h定义)的基本操作(9个) */ Status InitStack(SqStack *S) { /* 构造一个空栈S */ (*S).base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!(*S).base) exit(OVERFLOW); /* 存储分配失败 */ (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; return OK; } Status DestroyStack(SqStack *S) { /* 销毁栈S,S不再存在 */ free((*S).base); (*S).base=NULL; (*S).top=NULL; (*S).stacksize=0; return OK; } Status ClearStack(SqStack *S) { /* 把S置为空栈 */ (*S).top=(*S).base; return OK; } Status StackEmpty(SqStack S) { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ if(S.top==S.base) return TRUE; else return FALSE; } int StackLength(SqStack S) { /* 返回S的元素个数,即栈的长度 */ return S.top-S.base; } Status GetTop(SqStack S,ElemType *e) { /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */ if(S.top>S.base) { *e=*(S.top-1); return OK; } else return ERROR; } Status Push(SqStack *S,ElemType e) { /* 插入元素e为新的栈顶元素 */ if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */ { (*S).base=(ElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(ElemType)); /* 分配新的空间是将栈整体存入新的更大的存储空间,所以要用realloc()函数 */ if(!(*S).base) exit(OVERFLOW); /* 存储分配失败 */ (*S).top=(*S).base+(*S).stacksize; (*S).stacksize+=STACKINCREMENT; } *((*S).top)++=e; return OK; } Status Pop(SqStack *S,ElemType *e) { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */ if((*S).top==(*S).base) return ERROR; *e=*--(*S).top; //先减一, 指向栈顶元素, 然后传值给e return OK; } Status StackTraverse(SqStack S,Status(*visit)(ElemType)) { /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */ /* 一旦visit()失败,则操作失败 */ while(S.top>S.base) visit(*S.base++);//从栈底到栈顶遍历 printf("\n");//全部输出完毕后换行 return OK; } #endif //STACK_STACKFUNC_CPP 头文件head.h / // Created by Cooper on 23/10/2016. // #ifndef STACK_HEADER_H #define STACK_HEADER_H #include <string.h> #include <ctype.h> #include <malloc.h> #include <limits.h> #include <stdio.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType; /* 栈的顺序存储表示 */ #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 typedef struct SqStack { ElemType *base; //在栈构造之前和销毁之后,base的值为NULL ElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间, 以元素为单位 }SqStack; //顺序栈 /* 使用指针传参的函数 */ Status InitStack(SqStack *S); Status StackTraverse(SqStack S,Status(*visit)(ElemType)); Status Pop(SqStack *S,ElemType *e); Status Push(SqStack *S,ElemType e); Status GetTop(SqStack S,ElemType *e); int StackLength(SqStack S); Status StackEmpty(SqStack S) ; Status ClearStack(SqStack *S); Status DestroyStack(SqStack *S); Status visit(ElemType); /* 使用引用传参的函数 */ //Status InitStack(SqStack &S); //Status StackTraverse(SqStack S,Status(*visit)(ElemType)); //Status Pop(SqStack &S,ElemType &e); //Status Push(SqStack &S,ElemType e); //Status GetTop(SqStack S,ElemType &e); //int StackLength(SqStack S); //Status StackEmpty(SqStack S) ; //Status ClearStack(SqStack &S); //Status DestroyStack(SqStack &S); //Status visit(ElemType);
相关文章推荐
- 数据结构 严蔚敏 清华大学出版社 第一章 抽象数据类型 三元组的实现 成功编译并运行
- 数据结构 严蔚敏 清华大学出版社 第二章 抽象数据类型 链表的实现 成功编译并运行
- 数据结构 严蔚敏 清华大学出版社 第一章 抽象数据类型 三元组的实现 成功编译并运行
- 字符串完美度计算的C实现(我自己编译运行正确,编程挑战赛时不管怎么都成功不了,奇了个葩)
- 严蔚敏 数据结构 二叉树 代码C语言实现 用C++编译器运行
- 严蔚敏 数据结构 栈 代码C语言实现 用C++编译器运行
- 程序编译成功,但是运行时不出现运行结果的界面(TC)
- Hlsl Shader 编译运行成功
- 严蔚敏《数据结构》C语言版 第三章 算法3.4 表达式求值
- 数据结构 第三章-- 循环队列(队列的顺序表示和实现)
- VS2010下GSL的配置(成功编译运行)
- 基于半边数据结构(翼边数据结构)的Eular操作来实现扫成 通过OpenGL进行CAD实体建模 经测试可直接运行
- VS2010下GSL的配置(成功编译运行)
- 以CRichEditView为基类的MFC单文档程序向导建立后编译成功运行失败问题
- 利用ffmpeg实现视频格式转换成flv,保证能成功运行
- kmp算法的实现,严蔚敏版本(调试成功)
- Android NDK-r5 成功运行编译运行第一个NDK程序
- 堆排序 HeapSort C语言实现 附严蔚敏数据结构P282 代码错误
- 很偏僻的运行错误,编译成功,运行失败,原因:语句太长
- 内存数据库内核开发 工作日志(内存索引实现原理)(附红黑树实现清晰完整直接可编译运行代码)(十)