首页 > 代码库 > 08.栈(二)栈的应用

08.栈(二)栈的应用

一、栈的应用-递归
1.递归函数:把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称为递归函数。
2.栈与递归
     递归函数实际是一个前行和退回的过程,相当与入栈、出栈。在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出(出栈),用于返回调用层次中执行代码的其余部分,也就是恢复了调用的状态。
3.递归应用-斐波那契数列
    斐波那契数列描述的是兔子的繁殖问题,这个数列有个十分明显的特点:前面相邻两项之和,构成了后一项。
数学模型为:
         | 0,当n=0时,其中n为月个数
F(n)=| 1,当n=1时
         |F(n-1)+F(n-2),当n>1。其中n为经历的月个数,F(n)为第n个月时兔子的数量。
递归实现源码:
/*斐波那契的递归函数
*实现打印前40位斐波那契数列
    */
int Fb(int i)    //i为第i个月
{
    if(i<2)
        return i==0?0:1;            //当n=0、n=1时情况,该月返回的兔子总数=0/1
    return Fb(i-1)+Fb(n-2);    //当n>1时,第i个月返回的兔子总数
}
int main()
{
    int i;
    for(int i=0;i<40;i++)    //依次计算并打印前40个月兔子的数量
    {
          printf("%d",Fb(i));  
    }
    return 0;
}

二、栈的应用-四则运算表达式求值
1.中缀表达式转换为后缀表达式
(1)目标:中缀表达式"9+(3-1)*3+10/2"转化为后缀表达式"9 3 1 - 3 * + 10 2 / +"
(2)规则:从左到右遍历中缀表达式的每个数字和符号。若是数字就输出,若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号,则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
2.后缀表达式计算结果
(1)目标:计算后缀表达式"9 3 1 - 3 * + 10 2 / +"
(2)规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,再将运算结果进栈,一直得到最终结果。
总结:
将中缀表达式转换为后缀表达式关键在于-栈用来进出运算的符号
将后缀表达式进行运算的得出结果关键在于-栈用来进出运算的数字。

08.栈(二)栈的应用