✌ 题目及题解持续更新中
【2023王道数据结构目录】课后算法设计题C、C++代码实现完整版大全
题目: 利用栈实现斐波那契数列
解题思路:
斐波那契数列两种实现:
>利用递归,无需多说
>利用栈,就是找二叉树的叶子结点个数,不断将子节点压入栈中
代码实现:
#include <iostream>
using namespace std;
#define MAXSIZE 100
//定义栈
typedef struct
{
int data[MAXSIZE];
int top1 = -1;
} Stack;
//判断栈是否为空
bool StackEmpty(Stack s)
{
if (s.top1 == -1)
{
return true;
}
return false;
}
//判断栈是否溢出
bool StackOverflow(Stack s)
{
if (s.top1 >= MAXSIZE)
{
return true;
}
return false;
}
//压栈
void Push(Stack &s, int x)
{
if (!StackOverflow(s))
{
s.data[++s.top1] = x;
}
else
{
cout << "当前栈已满" << endl;
}
}
//弹栈
int Pop(Stack &s)
{
if (StackEmpty(s))
{
cout << "当前栈已空" << endl;
return '\0';
}
else
{
return s.data[s.top1--];
}
}
//利用递归实现斐波那契数列
int FibRecursion(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
return FibRecursion(n - 1) + FibRecursion(n - 2);
}
//利用栈实现斐波那契数列
int FibStack(int n)
{
Stack s; //初始化栈
int result = 0;
Push(s, n); //将根节点压入栈中
while (!StackEmpty(s))
{
//将栈顶元素弹出
int value = Pop(s);
//计算叶子结点个数
if (value == 1 || value == 2)
{
result += 1;
}
//将根节点的两个子节点压入栈中
else
{
Push(s, value - 1);
Push(s, value - 2);
}
}
return result;
}
int main()
{
cout << FibRecursion(7) << endl;
cout << FibStack(7) << endl;
}