栈的应用:
递归
栈有一个很重要的应用:在程序设计语言中实现了递归。下面介绍一个经典的递归例子:斐波那契数列。
1,1,2,3,5,8,13,21,34,45,........这样的数列有很明显的规律,前两项和为第三项的值。用数学函数就是这样的:
如果想打印前40位数字,我们首相想到的就是用迭代法来实现,这里代码就不演示了,而用递归就能比迭代更加简单一些。代码如下:
int fun(int i)
{
if(i < 2)
{
return i == 0 ? 0 : 1;
}
return fun(i - 1) + fun(i - 2);
}
int mian()
{
int i;
for(i = 0; i < 40; i++)
{
printf("%d ",fun(i));
}
ruturn 0;
}
递归的定义:
把一个直接调用自己或者通过一系列的调用语句间接地调用自己的函数,称作递归函数。每个递归定义必须 至少有一个条件,满足时不再进行递归,即不再引用自身而是返回值退出。
四则运算表达式求值:
后缀表达法:
举个例子,9+(3-1)*3+10/2这个表达式用后缀表达法应该是“9 3 1 -3 * + 10 2 / +”。
举个例子,9+(3-1)*3+10/2这个表达式用后缀表达法应该是“9 3 1 -3 * + 10 2 / +”。
规则(以上述式子举例):
1.初始化一个空栈,此栈用来对应运算的数字进出使用
2.后缀表达式中前三个都是数字,所以9,3,1进栈
3.接下来是“-”,将栈中的1出栈作为减数,3作为被减数,运算得到2,2进栈
4.接着3进栈
5.后面是“*”,所以3,2出栈得到6,6进栈
6.下面是“+”,然后6,9出栈得到15,15进栈
7.接着是10与2进栈
8.然后是符号“/”,所以2,10出栈得到5,5进栈
9.最后一个符号是“+”,15和5出栈得到20,20进栈
10.最后20出栈,栈为空
2.后缀表达式中前三个都是数字,所以9,3,1进栈
3.接下来是“-”,将栈中的1出栈作为减数,3作为被减数,运算得到2,2进栈
4.接着3进栈
5.后面是“*”,所以3,2出栈得到6,6进栈
6.下面是“+”,然后6,9出栈得到15,15进栈
7.接着是10与2进栈
8.然后是符号“/”,所以2,10出栈得到5,5进栈
9.最后一个符号是“+”,15和5出栈得到20,20进栈
10.最后20出栈,栈为空
那么怎么将中缀表达式转化为后缀表达式呢?
1. 初始化一空栈,用来对符号进出栈使用。
2. 第一个字符是数字9,输出9,后面是符号“+”,进栈。
3. 第三个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。
4. 第四个字符是数字3,输出,总表达式为9 3,接着是“-”进栈。
5. 接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”,总的输出表达式为9 3 1 -
6. 接着是数字3,输出,总的表达式为9 3 1 - 3 。紧接着是符号“*”,因为此时的栈顶符号为“+”号,优先级低于“*”,因此不输出,进栈。
7. 之后是符号“+”,此时当前栈顶元素比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”号更低的优先级,所以全部出栈),总输出表达式为 9 3 1 - 3 * +.然后将当前这个符号“+”进栈。也就是说,前6张图的栈底的“+”是指中缀表达式中开头的9后面那个“+”,而下图中的栈底(也是栈顶)的“+”是指“9+(3-1)*3+”中的最后一个“+”。
8. 紧接着数字10,输出,总表达式变为9 3 1-3 * + 10。
9. 最后一个数字2,输出,总的表达式为 9 3 1-3*+ 10 2
10. 因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为 9 3 1-3*+ 10 2/+
2. 第一个字符是数字9,输出9,后面是符号“+”,进栈。
3. 第三个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。
4. 第四个字符是数字3,输出,总表达式为9 3,接着是“-”进栈。
5. 接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”,总的输出表达式为9 3 1 -
6. 接着是数字3,输出,总的表达式为9 3 1 - 3 。紧接着是符号“*”,因为此时的栈顶符号为“+”号,优先级低于“*”,因此不输出,进栈。
7. 之后是符号“+”,此时当前栈顶元素比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”号更低的优先级,所以全部出栈),总输出表达式为 9 3 1 - 3 * +.然后将当前这个符号“+”进栈。也就是说,前6张图的栈底的“+”是指中缀表达式中开头的9后面那个“+”,而下图中的栈底(也是栈顶)的“+”是指“9+(3-1)*3+”中的最后一个“+”。
8. 紧接着数字10,输出,总表达式变为9 3 1-3 * + 10。
9. 最后一个数字2,输出,总的表达式为 9 3 1-3*+ 10 2
10. 因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为 9 3 1-3*+ 10 2/+