利用递归函数将一个栈逆序,不能申请新的数据结构。
参考了常用解法,即两个递归函数嵌套使用,第一个递归函数用于获取栈的栈底元素,另一个递归函数用于逆序这个栈。
代码如下:
int getBottomElement(element *data)
{
int result=pop(data); //弹出一个元素
if(isEmpty(data)==1)
return result;
else
{
int last=getBottomElement(data);
printf("getBottomElement函数被调用\n");
push(result,data);
return last;
}
}
void reverseStack(element *data)
{
if(isEmpty(data)==1)
return;
printf("reverse函数被调用\n");
int i=getBottomElement(data);
reverseStack(data);//每一层调用时这个data的变量值都是上一层取出栈底元素之后的值,所以这个栈再每一次递归中就会减少一个元素,直至空栈
push(i,data);
}
void main()
{
int i=0;
int value=0;
element stack;
stack=init();
for(i=0;i<MAX_STACK_SIZE;i++)
{
printf("please input value to push into stack:\n");
scanf("%d",&value);
push(value,&stack);
}
reverseStack(&stack);
print(&stack);
}
这个解法充分利用了递归函数的特点,将递归函数的函数栈作为另一个数据结构用于逆序排列。
递归函数类似于一个循环处理的过程,递归结束的条件非常重要,同时递归是从最里面的一层函数调用层层向上返回。