求个遍历栈的函数StackTraverse,具体内容如下~

求个遍历栈的函数StackTraverse(SqStack S,Status(*visit)(SqStack S,int i)) ,实现输出栈中所有元素,我自己写老是函数指针那里编译不过

哆啦的时光机
浏览 818回答 2
2回答

手掌心

&nbsp;表示对数据结构中结点的访问,所以是传相应的参数进去,然后输出来用途:&nbsp;&nbsp;对所有的输出统一格式,想修改printf里面的内容,只需要修改visit函数块里面的一处 #include<stdio.h>#include<malloc.h>#include<conio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#include<conio.h>#define&nbsp;ERROR&nbsp;0#define&nbsp;TRUE&nbsp;1#define&nbsp;FALSE&nbsp;0#define&nbsp;OK&nbsp;1#define&nbsp;EQUAL&nbsp;1#define&nbsp;OVERFLOW&nbsp;-1#define&nbsp;STACK_INIT_SIZE&nbsp;100#define&nbsp;STACKINCREMENT&nbsp;10typedef&nbsp;int&nbsp;Status&nbsp;;struct&nbsp;STU{&nbsp;&nbsp;char&nbsp;name[20];&nbsp;&nbsp;char&nbsp;stuno[10];&nbsp;&nbsp;int&nbsp;age;&nbsp;&nbsp;int&nbsp;score;};typedef&nbsp;struct&nbsp;STU&nbsp;SElemType;struct&nbsp;STACK{&nbsp;&nbsp;SElemType&nbsp;*base;&nbsp;&nbsp;SElemType&nbsp;*top;&nbsp;&nbsp;int&nbsp;stacksize;};typedef&nbsp;struct&nbsp;STACK&nbsp;SqStack;typedef&nbsp;struct&nbsp;STACK&nbsp;*pSqstack;Status&nbsp;InitStack(SqStack&nbsp;&nbsp;**S);Status&nbsp;DestroyStack(SqStack&nbsp;*S);Status&nbsp;ClearStack(SqStack&nbsp;*S);Status&nbsp;StackEmpty(SqStack&nbsp;S);Status&nbsp;StackLength(SqStack&nbsp;S);Status&nbsp;GetTop(SqStack&nbsp;S,SElemType&nbsp;*e);Status&nbsp;Push(SqStack&nbsp;*S,SElemType&nbsp;e);Status&nbsp;Pop(SqStack&nbsp;*S,SElemType&nbsp;*e);Status&nbsp;StackTraverse(SqStack&nbsp;S,Status&nbsp;(*visit)());Status&nbsp;InitStack(SqStack&nbsp;**S){&nbsp;&nbsp;(*S)=(SqStack&nbsp;*)&nbsp;malloc(sizeof(SqStack));&nbsp;&nbsp;(*S)->base=(SElemType&nbsp;*)malloc(STACK_INIT_SIZE&nbsp;*sizeof(SElemType));&nbsp;&nbsp;if(!(*S)->base)exit(OVERFLOW);&nbsp;&nbsp;(*S)->top=(*S)->base;&nbsp;&nbsp;(*S)->stacksize=STACK_INIT_SIZE;&nbsp;&nbsp;return&nbsp;OK;}Status&nbsp;DestroyStack(SqStack&nbsp;*S){&nbsp;free(S->base);&nbsp;free(S);}Status&nbsp;ClearStack(SqStack&nbsp;*S){&nbsp;&nbsp;S->top=S->base;}Status&nbsp;StackEmpty(SqStack&nbsp;S){&nbsp;&nbsp;if(S.top==S.base)&nbsp;return&nbsp;TRUE;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;}int&nbsp;StackLength(SqStack&nbsp;S){&nbsp;&nbsp;int&nbsp;i;&nbsp;&nbsp;SElemType&nbsp;*p;&nbsp;&nbsp;i=0;&nbsp;&nbsp;p=S.top;&nbsp;&nbsp;while(p!=S.base)&nbsp;&nbsp;&nbsp;&nbsp;{p++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;&nbsp;&nbsp;&nbsp;}}Status&nbsp;GetTop(SqStack&nbsp;S,SElemType&nbsp;*e){&nbsp;&nbsp;if(S.top==S.base)&nbsp;return&nbsp;ERROR;&nbsp;&nbsp;*e=*(S.top-1);&nbsp;&nbsp;return&nbsp;OK;}Status&nbsp;Push(SqStack&nbsp;*S,SElemType&nbsp;e){&nbsp;/*&nbsp;&nbsp;if(S->top&nbsp;-&nbsp;S->base>=S->stacksize)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S->base=(SElemType&nbsp;*)&nbsp;realloc(S->base,&nbsp;&nbsp;&nbsp;&nbsp;(S->stacksize&nbsp;+&nbsp;STACKINCREMENT)&nbsp;*&nbsp;sizeof(SElemType));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!S->base)exit(OVERFLOW);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S->top=S->base+S->stacksize;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S->stacksize&nbsp;+=&nbsp;STACKINCREMENT;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;*/&nbsp;&nbsp;*(S->top++)=e;&nbsp;&nbsp;return&nbsp;OK;}Status&nbsp;Pop(SqStack&nbsp;*S,SElemType&nbsp;*e){&nbsp;&nbsp;if(S->top==S->base)&nbsp;return&nbsp;ERROR;&nbsp;&nbsp;*e=*--S->top;&nbsp;&nbsp;return&nbsp;OK;}Status&nbsp;StackPrintElem(SElemType&nbsp;*&nbsp;e){&nbsp;&nbsp;printf("%s&nbsp;&nbsp;%s&nbsp;&nbsp;%d&nbsp;&nbsp;%d\n",e->name,e->stuno,e->age,e->score);}Status&nbsp;StackTraverse(SqStack&nbsp;S,Status&nbsp;(*visit)()){&nbsp;&nbsp;while(S.top!=S.base)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(--S.top);}void&nbsp;main(){&nbsp;&nbsp;SElemType&nbsp;e;&nbsp;&nbsp;SqStack&nbsp;*Sa;&nbsp;&nbsp;printf("\n\n-------------------SqStack&nbsp;Demo&nbsp;is&nbsp;running...----------------\n\n");&nbsp;&nbsp;printf("First&nbsp;is&nbsp;Push&nbsp;function.\n");&nbsp;&nbsp;InitStack(&Sa);&nbsp;&nbsp;strcpy(e.name,"stu1");&nbsp;&nbsp;strcpy(e.stuno,"100001");&nbsp;&nbsp;e.age=80;&nbsp;&nbsp;e.score=1000;&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;Now&nbsp;Stack&nbsp;is&nbsp;Empty.\n");&nbsp;&nbsp;StackTraverse(*Sa,StackPrintElem);&nbsp;&nbsp;Push(Sa,e);&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;Now&nbsp;Stack&nbsp;has&nbsp;one&nbsp;element.\n");&nbsp;&nbsp;StackTraverse(*Sa,StackPrintElem);&nbsp;&nbsp;strcpy(e.name,"stu3");&nbsp;&nbsp;strcpy(e.stuno,"100002");&nbsp;&nbsp;e.age=80;&nbsp;&nbsp;e.score=1000;&nbsp;&nbsp;Push(Sa,e);&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;Now&nbsp;Stack&nbsp;has&nbsp;another&nbsp;element.\n");&nbsp;&nbsp;StackTraverse(*Sa,StackPrintElem);&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;Now&nbsp;Pop&nbsp;Stack,the&nbsp;top&nbsp;elem&nbsp;put&nbsp;into&nbsp;variable&nbsp;e.\n");&nbsp;&nbsp;Pop(Sa,&e);&nbsp;&nbsp;printf("%s\n%s\n%d\n%d\n",e.name,e.stuno,e.age,e.score);&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;Let's&nbsp;see&nbsp;the&nbsp;left&nbsp;of&nbsp;Stack's&nbsp;elem:\n");&nbsp;&nbsp;StackTraverse(*Sa,StackPrintElem);&nbsp;&nbsp;getch();&nbsp;&nbsp;printf("\n\n\nWelcom&nbsp;to&nbsp;visit&nbsp;http://zmofun.topcool.net\n\n");}

繁花如伊

void Visit(int e){cout<<e<<" ";}void StackTra(SqStack s,void(*Visit)(int)) //这个参数是函数指针,就是把一个函数当做参数传入另一个函数,没有什么别的意思 这里的Visit不是指上边的那个函数,而是指一个函数指针变量,你在调用这个函数的时候需要这样写 StackTra(s,Visit)----这里的Visit才指的是你前边定义的那个函数{ //从栈底开始访问栈元素while(s.top>s.base){Visit(*s.base);s.base++;}cout<<endl;}这里你的栈必须是连续的,而且base指向的是低地址,top指向的是高地址,如果是一个类的话,那你必须重新构造迭代器,为你的base重载一个 ++ 的方法,因为栈的定义是从栈顶开始访问的,但是从栈底访问可是可以做的,只是这样颠覆了栈的概念,一般人不这么干——就程序本身而言是有一定的bug的,大端模式跟小端模式下可能就是两种情况了
打开App,查看更多内容
随时随地看视频慕课网APP