typedefcharSElemType;#includemalloc.h#includestdio.h#includemath.h#includestdlib.h//exit()#defineOK1#defineERROR0#defineTRUE1#defineFALSE0typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等#defineSTACK_INIT_SIZE10//存储空间初始分配量#defineSTACKINCREMENT2//存储空间分配增量structSqStack{SElemType*base;//在栈构造之前和销毁之后,base的值为NULLSElemType*top;//栈顶指针intstacksize;//当前已分配的存储空间,以元素为单位};//顺序栈StatusInitStack(SqStack&S){S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)returnERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;//构造一个空栈S}StatusStackEmpty(SqStackS){if(S.base==S.top)returnTRUE;elsereturnFALSE;//若栈S为空栈,则返回TRUE,否则返回FALSE}StatusClearStack(SqStack&S){//把S置为空栈S.top=S.base;returnOK;}StatusDestroyStack(SqStack&S){//销毁栈S,S不再存在free(S.base);S.base=NULL;S.top=NULL;S.stacksize=0;returnOK;}StatusPush(SqStack&S,SElemTypee){if(S.top-S.base=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)returnERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}//插入元素e为新的栈顶元素*S.top++=e;returnOK;}StatusPop(SqStack&S,SElemType&e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*--S.top;returnOK;}StatusStackTraverse(SqStackS,Status(*visit)(SElemType)){//从栈底到栈顶依次对栈中每个元素调用函数visit()。//一旦visit()失败,则操作失败while(S.topS.base)visit(*S.base++);printf(\n);returnOK;}Statusvisit(SElemTypec){printf(%c,c);returnOK;}voidLineEdit(){//利用字符栈s,从终端接收一行并送至调用过程的数据区。算法3.2SqStacks;charch,c;intn,i;InitStack(s);scanf(%d,&n);ch=getchar();for(i=1;i=n;i++){ch=getchar();while(ch!='\n'){switch(ch){case'#':Pop(s,c);break;//仅当栈非空时退栈case'@':ClearStack(s);break;//重置s为空栈default:Push(s,ch);//有效字符进栈}ch=getchar();//从终端接收下一个字符}StackTraverse(s,visit);//将从栈底到栈顶的栈内字符输出ClearStack(s);//重置s为空栈}DestroyStack(s);}intmain(){LineEdit();returnOK;}