MFC 实现 可加减乘除,括号,乘方 以及进制转换的 计算器
一、带括号的四则运算以及乘方运算
输入的字符串为中缀表达式,我们对表达式进行求值,则首先要解决的问题即为运算优先级,然后再进行求值,通俗的说就是我先根据计算优先级确定好表达式计算的顺序,然后我在根据这个顺序一步一步进行计算。。
那么,首先,我们先处理运算优先级,这里我们用到数据结构以及离散数学里面的一个知识点,将中缀表达式转化为后(前)缀表达式,或者说是将中序遍历表达式树转化为后(前)序遍历。这里 小熊 给大家介绍的方法是 中缀表达式转化为后缀表达式。
学过了数据结构的同学这里应该很容易理解,比如表达式a*(b+ c)-d我们这里转化的规则为:
从左到右扫描a*(b + c)-d的每一数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘方优先乘除,乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。【PS:这里“输出”的意思是将字符存入 一个字符串里面】。
考虑到读者可能还是感到有点迷惑,小熊 以具体的例子给大家进行分析吧!比如,输入的表示式为9+(3-1)*3+10/2【这样运算符号在两数字之间的,叫做中缀表达式】
【PS:下图非原创,为了大家能够清楚地理解这个过程,引用了别人的例子】