www.pudn.com > gc.rar > 8_3_ACKERMANN.C


# include  
# define MAXN 8000 
typedef struct node { 
	int n; 
	double x,y; 
}NODE; 
 
NODE stack[MAXN]; 
int top,deb,depth; 
 
/*顺序存储栈的进栈函数*/ 
int push(NODE stack[],int maxn,int *toppt,NODE x)     /*进栈函数*/ 
{ 
	if (*toppt >= maxn) return 1; /*栈满,进栈失败返回1 */ 
	stack[*toppt] = x;                     /*完成进栈运算   */ 
	++ *toppt; 
	if (*toppt > depth) depth = *toppt; 
	return 0;                               /*进栈成功,返回0 */ 
} 
 
/*顺序存储栈的出栈函数*/ 
int pop(NODE stack[],int *toppt,NODE *cp) 
{ 
	if(*toppt == 0) return 1;                                /*栈空,出栈失败返回1 */ 
	-- *toppt; 
	*cp = stack[*toppt];                                  /*完成出栈运算 */ 
	return 0;                                             /*出栈成功,返回0*/ 
 
} 
 
double A(NODE node) 
{ 
	int k; double B; 
	NODE tnode; 
	top = 0;depth = 0; 
	push(stack,MAXN,&top,node);                     /* 将node进栈*/ 
	do {                                            /*循环计算至栈空*/ 
		tnode = stack[top-1];                       /*读栈顶结点的值存入tnode*/ 
		while (tnode.n != 0 && tnode.y !=0) {       /*递推,将计算结果进栈*/ 
			/* 修改栈顶结点的参数,并求得新结点进栈*/ 
			stack[top-1].n--;stack[top-1].y = stack[top-1].x; 
			stack[top-1].x = -1.0;                         /*表示x值不定*/ 
			tnode.y -= 1.0; 
			if(push(stack,MAXN,&top,tnode)) return -1.0;    /*将tnode进栈*/ 
		} 
		if (deb) { 
			for (k = 0 < top-10? top-10:0;k