非递归中用到了链栈
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node;
typedef struct
{
Node *top;
Node *base;
}Stack;
int InitNode(Stack *p)
{
p->base=(Node *)malloc(sizeof(Node));
if(!p->base)
return 0;
p->top=p->base;
p->top->data=0;
p->top->next=NULL;
return 1;
}
int Push(Stack *p,int e)
{
Node *p1;
p1=malloc(sizeof(Node));
if(p->base==p->top)
{
p1->data=e;
p->top=p1;
p1->next=NULL;
}
else
{
p1->data=e;
p1->next=p->top;
p->top=p1;
}
return 1;
}
int Pop(Stack *p,int e)
{
Node *p1;
if(p->base==p->top)
return 0;
e=p->top->data;
p1=p->top;
p->top=p->top->next;
free(p1);
return 1;
}
int getTop(Stack *p,int e)
{
if(p->base==p->top)
return 0;
e=p->top->data;
return e;
}
void print(Stack *p)
{
Node *p1;
printf("栈内元素如下:\n");
if(p->base==p->top)
{
printf("栈为空!!\n");
exit(0);
}
p1=p->top;
while(p1!=NULL)
{
printf("%d ",p1->data);
p1=p1->next;
}
printf("\n");
}
int Length(Stack *p)
{
int a=0;
Node *p1;
p1=p->top;
while(p1!=NULL)
{
p1=p1->next;
a++;
}
return a;
}
int getelem(Stack *p,int i)
{
Node *p1;
int k=1,a=0;
if(p->base==p->top)
return 0;
p1=p->top;
while((p1!=NULL)&&(k<i))
{
p1=p1->next;
k++;
}
return p1->data;
}
int add(int x)//递归方法
{
int a;
if(x==0)
a=0;
else
a=(2*add(x/2)+x);
return a;
}
int main()
{
Stack p;
int i,b=0,e=0,n,result=0,length=0;//i为循环变量,b储存栈顶元素(即运算结果),length为栈的长度
InitNode(&p);
printf("请输入n,计算t(n):");
scanf("%d",&n);
Push(&p,0);
length=Length(&p);
for(i=1;i<=n;i++)
{
e=2*getelem(&p,(length-(i/2)))+i;
Push(&p,e);
length=Length(&p);
}
b=getTop(&p,b);
printf("\n用链栈得到的结果如下:\n");
printf("t(%d)= %d \n",n,b);
printf("用递归方法得到的结果如下:\n");
result=add(n);
printf("t(%d)= %d \n",n,result);
return 0;
}