资源描述:
《用顺序栈进行栈的基本操作-C源程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、//main3-l.cpp检验bo3-l.cpp的主程序//#includeHcl.hn#include#include#include#include#include//#include#include#include#include#include#include//提供宏va_start,va_arg和va_end,用于存取变长参数表#defineTRUE1♦de
2、fineFALSE0#defineOK1#defineERROR0//#defineINFEASIBLE-1没使用//ttdefineOVERFLOW-2因为在math.h中已定义0VERFLOW的值为3,故去掉此行typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSEtypedefintSElemType;//定义栈元素类型,此句要在c3-l・h的前面//#includef,c3-l.hn#defineSTACK_INIT_SIZE10//存储空
3、间初始分配量♦defineSTACK_INCREMENT2//存储空间分配增量structSqStack//顺序栈SElemType*base;//在栈构造之前和销毁之后,base的值为NULLSElemType*top;//栈顶指针intstacksize;//当前已分配的存储空间,以元素为单位};voidInitStack(SqStack&S)//构造一个空栈S。{if(!(S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))exit(OVERFLOW);//动态分配存储空间失败,则退出S.top=S.b
4、ase;//栈顶指向栈底(空栈)S.stacksize=STACK_INIT_SIZE;//存储空间为初始分配量)voidDestroyStack(SqStack&S)//销毁栈S,S不再存在{free(S.base);//释放栈空间S・top二S・base二NULL;//栈顶、栈底指针均为空S.stacksize=O;//当前已分配的存储空间为0}voidClearStack(SqStack&S)//把栈S置为空栈{S.top=S.base;//栈顶指针指向栈底}StatusStackEmpty(SqStackS)//若栈S为空栈,则返冋TRUE;否则返冋FALSE{if(S.
5、top==S.base)//空栈条件returnTRUE;elsereturnFALSE;intStackLength(SqStackS)//返回栈S的元素个数,即栈的长度{returnS・top-S.base;}StatusGetTop(SqStackSzSElemType&e)//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR{if(S・top>S・base)//栈不空{e=*(S.top-1);//将栈顶元素赋给ereturnOK;}elsereturnERROR;}voidPush(SqStack&S,SElemTypee)//插入元素e为栈S新的栈顶
6、元素{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;//更新当前已分配的存储空间}SS・top)++=e;//将e入栈,成为新的栈顶元素,栈顶指针上移1个存储单元S
7、tatusPop(SqStack&SzSElemType&e){if(S.top==S.base)//栈空returnERROR;e=*-S.top;//将栈顶元素赋给e,栈顶指针卞移1个存储单元returnOK;}voidStackTraverse(SqStackS,void(*visit)(SElemType))//从栈底到栈顶依次对栈S中每个元素调用函数visitO{while(S.top>S.base)//S.base指向栈元素visit(*S.base++);//对该栈