数据结构(六)——栈的应用
2016-11-19 14:35
148 查看
栈的应用:
栈有一个很重要的应用:在程序设计语言中实现了递归。下面介绍一个经典的递归例子:斐波那契数列。
1,1,2,3,5,8,13,21,34,45,........这样的数列有很明显的规律,前两项和为第三项的值。用数学函数就是这样的:
如果想打印前40位数字,我们首相想到的就是用迭代法来实现,这里代码就不演示了,而用递归就能比迭代更加简单一些。代码如下:
[cpp] view
plain copy
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 / +”。
规则(以上述式子举例):
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出栈,栈为空
那么怎么将中缀表达式转化为后缀表达式呢?
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/+
递归
栈有一个很重要的应用:在程序设计语言中实现了递归。下面介绍一个经典的递归例子:斐波那契数列。1,1,2,3,5,8,13,21,34,45,........这样的数列有很明显的规律,前两项和为第三项的值。用数学函数就是这样的:
如果想打印前40位数字,我们首相想到的就是用迭代法来实现,这里代码就不演示了,而用递归就能比迭代更加简单一些。代码如下:
[cpp] view
plain copy
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 / +”。
规则(以上述式子举例):
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出栈,栈为空
那么怎么将中缀表达式转化为后缀表达式呢?
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/+
相关文章推荐
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据结构中关键路径算法的实现与应用
- 【数据结构与算法基础】栈及其应用后缀、中缀表达式 / Stack and postfix/infix expression
- 哈工大数据结构实验3 图的应用
- 数据结构中树的应用
- 数据结构(二)--栈的应用(数制转换器)
- 数据结构之栈的应用----C程序的括号配对检查
- 数据结构在.net加密解密反流程混淆中的应用[看雪学院2006金秋读书季]
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据结构与算法面试题汇编(1)- 链表的操作与应用
- 数据结构中关键路径算法的实现与应用
- 数据结构之应用"栈(Stack)"实现: 解析算术表达式及计算
- VB之数据报表设计器在多层结构开发的应用---技术在更新,而思路则不变
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- 树形结构在开发中的应用(C# TreeView数据动态绑定)
- COM+(三层结构)应用中数据访问的技术(E)
- 经典数据结构之栈的应用-迷宫问题
- 数据结构实现顺序线性表的一些小应用
- 【数据结构与算法】第三章 表c实现应用一-----------多项式
- 数据结构在实际开发过程中的应用