前辍表达式,中辍表达式,后辍表达式详解

来源:互联网 发布:淘宝销售额排行榜 编辑:程序博客网 时间:2024/05/21 05:20
/*对于科学计算器的算法运用,有简单的算法也有难的算法,比如我博客中的基本功能的算法代码,思维简单,但是代码编写起来却是麻烦有难度。所以牛逼的大神么就搞出了几种牛逼的表达式,通过运用数据结构-栈-的优势,充分的利用了他的递归性,达到了让人想象不到的高效率及便利性。所以在这里给大家说说清楚,以免大家遇到问题时可以非常快的解决。首先介绍一个概念,叫做中辍表达式例子:1+2-3*(4-5)1+2*(3-4)-5*6这些生活中,用于数学运算的就是中辍表达式他可以用二叉树的形式表现出来。下图是第一个式子的二叉树:*/


/*好,介绍完了简单的中辍表达式,开始介绍前辍表达式:所谓的前辍表达式是指将运算符放在操作数的前面。中辍表达式:1+2-3*(4-5)  ------>>>>>>>>前辍表达式:- + 1 2 * 3 - 4 5用前辍表达式进行计算的方法,从左开始往右边读取:原理:如果一个操作符后面跟着两个操作数时,则计算,然后将结果作为操作数替换(这个操作符和两个操作数),重复此步骤,直至所有操作符处理完毕。方法:我们可以用一个栈Sys来实现计算,扫描从右往左进行,如果扫描到操作数,则压进Sys,如果扫描到操作符,则从Sys弹出两个操作数进行相应的操作,并将结果压进Sys(Sys的个数出2个进1个),当扫描结束后,S2的栈顶就是表达式结果。同理,后辍表达式:中辍表达式:1+2-3*(4-5)  ------>>>>>>>>后辍表达式: 1 2 3 4 5 - * - +我们可以用一个栈Sys来实现计算,扫描从左往右进行,如果扫描到操作数,则压进Sys,如果扫描到操作符,则从Sys弹出两个操作数进行相应的操作,并将结果压进Sys(Sys的个数出2个进1个),当扫描结束后,Sys的栈顶就是表达式结果。{中缀转前缀:对中缀字符串String从右向左遍历。(先前说了,中转前有两个栈,一是字符栈一是数字栈)    1. String[i]为数字,直接输入数字栈。    2. String[i]为运算符,与数字栈顶元素进行比较。大于等于栈顶符号优先级,入字符栈;否则,弹出栈顶符号并将此时的符号插入符号栈。    3. String[i]为括号。如果为右括号,直接插入符号栈;否则,弹出逐个弹出符号栈中的元素并插入字符栈,直到右括号为止。    重复以上步骤至字符串的尾部,接着弹出数字栈中数字,然后再弹出符号栈的符号。    即为前缀表达式。}后缀表达式和前缀表达式看起来就像一对逆过程,实际上并不是这样子,因为字符读取的时候都是从左往右的,所以,前缀表达式往往需要用两个栈来计算(一般为一个数字栈,一个字符栈),有时,其中一个栈用来预处理:将字符串倒序压进栈中。另一个直接进行运算处理。{后辍的表达式求法与前辍基本等同。可以自己推演一下(只需要一个栈就可以完成)}在数据结构中还可以用一种东西来很好的解释他,就是二叉树遍历方法:前序遍历,后序遍历,中序遍历。分别对应前辍表达式,中辍表达式,后辍表达式,前序遍历=T是要遍历树的根指针,中序遍历要求在访问根后,遍历完左子树后,再遍历右子树。中序遍历=T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。后序遍历=T是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。需要判断根结点的左右子树是否均遍历过。*/


 

0 0
原创粉丝点击