栈-斐波那契数列
使用带头结点的链栈来逆序输出斐波那契数列,从命令行读入序列长度n。
方法一:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 10
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
} StackNode, *linkStack;
linkStack Init_linkStack()
{
//初始化带头节点的链栈
linkStack s =(StackNode*) malloc(sizeof(StackNode));
s->next = NULL;
return s;
}
int Empty_linkStack(linkStack s)
{
//判断是否空栈,如果空,返回1;如果非空,返回0;
if (s->next==NULL)
{
return 1;
}else{
return 0;
}
}
void Push_linkStatck(linkStack ls, datatype x)
{
//入栈
linkStack p;
p=(linkStack)malloc(sizeof(linkStack));
p->data=x;
p->next=ls->next;
ls->next=p;
}
int Pop_linkStack(linkStack ls, datatype *x)
{
//出栈
linkStack p;
if (ls->next==NULL)
{
return 0;
}
p=ls->next;
*x=p->data;
ls->next=p->next; //删除p结点
free(p);
return 1;
}
int Top_linkStack(linkStack ls, datatype *x)
{
//查栈顶
if (ls->next==NULL)
{
return 0;
}
*x=ls->next->data;
return 0;
}
void Fib_linkStack(linkStack ls, int n)
{
//利用栈结构,实现斐波那契数列。
int f1=1,f2=1;
Push_linkStatck(ls,1);
Push_linkStatck(ls,1);
for (int i = 1; i <= n-2; i++)
{
int s=f1+f2;
Push_linkStatck(ls,s);
f1=f2;
f2=s;
}
}
void Print_Stack(linkStack ls)
{
while (!Empty_linkStack(ls))
{
int t;
if (Pop_linkStack(ls, &t))
{
printf("%d;", t);
}
else
{
printf("NULL");
}
}
}
int main()
{
linkStack ls = Init_linkStack();
int n;
scanf("%d", &n);
Fib_linkStack(ls, n);
Print_Stack(ls);
return 0;
}
方法二:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include<math.h>
#define MAXSIZE 10
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
} StackNode, *linkStack;
linkStack Init_linkStack()
{
//初始化带头节点的链栈
linkStack s =(StackNode*) malloc(sizeof(StackNode));
s->next = NULL;
return s;
}
///
补全并提交下方代码
int Empty_linkStack(linkStack s)
{
//判断是否空栈,如果空,返回1;如果非空,返回0;
if (s->next==NULL)
{
return 1;
}else{
return 0;
}
}
void Push_linkStatck(linkStack ls, datatype x)
{
//入栈
linkStack p;
p=(linkStack)malloc(sizeof(linkStack));
p->data=x;
p->next=ls->next;
ls->next=p;
}
int Pop_linkStack(linkStack ls, datatype *x)
{
//出栈
linkStack p;
if (ls->next==NULL)
{
return 0;
}
p=ls->next;
*x=p->data;
ls->next=p->next; //删除p结点
free(p);
return 1;
}
int Top_linkStack(linkStack ls, datatype *x)
{
//查栈顶
if (ls->next==NULL)
{
return 0;
}
*x=ls->next->data;
return 0;
}
void Fib_linkStack(linkStack ls, int n)
{
//利用栈结构,实现斐波那契数列。
for (int i =1 ; i <= n; i++)
{
int ai=(1/sqrt(5))*(pow((1+sqrt(5))/2,i)-pow((1-sqrt(5))/2,i));
Push_linkStatck(ls,ai);
}
}
void Print_Stack(linkStack ls)
{
while (!Empty_linkStack(ls))
{
int t;
if (Pop_linkStack(ls, &t))
{
printf("%d;", t);
}
else
{
printf("NULL");
}
}
}
int main()
{
linkStack ls = Init_linkStack();
int n;
scanf("%d", &n);
Fib_linkStack(ls, n);
Print_Stack(ls);
return 0;
}