Helix浅谈算式处理(C++计算器源码发布)

最近一直在研究计算器,前段时间也算写出一个小有成果的版本,姑且命名为Helix SStrict Calculator Beta(HSSCalcBeta)吧,之后还会以面向对象的新思路写出更好的版本(往语法分析技术靠近)。

如果有什么不合理的地方,还请多多批评指教。

另附程序猿交流QQ群:532320075,在这个充满理想与奋斗的家,我们期待着您的加入^▽^。

目前计算器允许输入+-*/(),每一个操作符左右必须接受两个值(数字或计算出值的操作符),每一个值(包括括号)必须属于一个操作符。
所以尤其是-1,((1+2)),(1)都会报错。


二叉树:

来分析一下算式处理的原理吧。
我们发现,每一个操作符都以某种格式接受1个或n个值,然后运算返回一个值。
这样一来就形成了一种类似树状的结构。
我们弱化一下,让操作符接受2个值,比如+-*/,多叉树就变成了二叉树。


优先级处理:

然后就是优先级处理,就像小学数学教的乘除比加减优先一样。
例如5+3*2按原来应该先算5+3=8,然后再算8*2=16,但是由于*的优先级比+高,所以变成了3*2=6,5+6=11。
优先级处理示意图
如图,这就是在同一个算式串(括号)中出现两个运算符时的建树策略。


括号处理:

再到括号,括号是一个比较麻烦的东西,也是使这个计算器制作得不完善的最大因素(在未来的版本中,会作为两块单独的token处理)。
在当前的版本中,我们在最开始读入算式串时就对括号嵌套检查一遍,降低处理难度。
将括号的标记(inBracket)交给这个括号里优先级最低的运算符,这样就可以把这棵子树圈住,正确定位了。

没有扫描到 ( 时,就进行普通的优先级处理。
扫描到时,就建立子节点,并将输入处理交给子节点(接下来的输入是括号内的内容)。
扫描到 ) 时,就把输入处理返还给父节点。
以上就是大致的原理。


综上所述:

下图是测试用的算式串,我已经把建树的方式画出来,希望能帮助大家理解。
为了加快读取效率,我们先顺向读取建树,读到需要优先级处理时再回头纠错。
线上的字符代表因读取到这个字符而做的动作(或写入给某个元素)。
绿线代表读取到操作符并赋值给自身。
灰线代表因优先级处理而被断开的关系。
棕线代表因优先级处理而被连接上的关系。
建树示意图


建树策略:

根据一个节点是否有左子节点 操作符 右子节点分为stage left,stage oper,stage right,还有检查后面是否有 ) 或需要优先级处理的操作符的stage ending。
然后再根据输入是数字 操作符 括号或结束符编成状态机,进行建树。
再从root节点递归向下请求值,就能计算出结果了。
编成的实际有效代码约350行。

源码下载地址:
HSSCalcBeta.cpp
http://download.csdn.net/detail/fshelix/9764518

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值