请教高手读懂下面程序的f()函数部分
这个是在网上看到的例题,但是没有解释。下面这个程序运行无误,但是我看不懂其中的f()函数到底干什么的。请高手看懂后教下我,尤其是它的算法。它用的是递归算法。问题描述:假设停在铁路调度站入口处的车厢序列的编号依次为1,2,3...,n。设计一个程序,求出所有可能由此输出的长度为n的车厢序列。
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef int Status;
typedef struct{
int *base; //栈底指针
int *top; //栈顶指针
int stacksize; //栈空间大小
}SqStack;
Status InitStack(SqStack &S)
{
S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
} //创栈
Status Push(SqStack &S,int e)
{
if((S.top-S.base)>=S.stacksize)
{
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
} //进栈
Status Pop(SqStack &S,int &e)
{
if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;
} //出栈
Status StackEmpty(SqStack &S)
{
if(S.top==S.base)
return 1;
else return 0;
} //判断空栈
void print(int b[],int n)
{
int k;
for(k=0;k<n;k++)
printf("%d ",b[k]);
printf("\n");
}
void f(SqStack S,int a[],int b[],int p,int q,int n) //这个函数我看不懂,请高手告诉我它的算法思想,非常感激
{
if(p<n)
{
Push(S,a[p]); //递归进栈
f(S,a,b,p+1,q,n);
Pop(S,b[q]);
}
if(!StackEmpty(S))
{
Pop(S,b[q]); //递归出栈
f(S,a,b,p,q+1,n);
Push(S,b[q]);
}
if(q>=n&&StackEmpty(S)) print(b,n); //出栈完输出序列号
}
int main()
{ int i,n,a[STACK_INIT_SIZE],b[STACK_INIT_SIZE];
printf("请输入待调车厢数:\n");
scanf("%d",&n);
SqStack S;
InitStack(S);
for(i=0;i<n;i++)
a[i]=i+1;
printf("输出序列号为:\n");
f(S,a,b,0,0,n);
return 0;
}