c#实现科学计算器 设计篇之优先级表的另一种实现方案

博客介绍了运算符优先级算法规则,如栈顶运算符优先级与当前读入运算符优先级不同时的处理方式,以及遇到括号的处理规则。还提到完成分词结果扫描后栈中可能有未运算的运算符和数符需继续运算。此外,通过具体表达式说明了该优先级表存在的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是针对 设计篇之优先级表设计 一文写的,主要阐述优先级表设计的另外一种思路,当然这种思路可能是不正确的。

在这种设计中,优先级被划分为7个级别:P0,P1,P2,P3,P4,P5,P6,P7,P0优先级最低,P7最高。
优先级运算符
P0#(
P1+ -
P2*/ %
P3保留
P4sin,cos,tg,ctg,asin,acos,atg,actg
P5lg,log,ln
P6pow
P7保留

我们规定:
1. 如果运算符栈顶的运算符优先级高于或等于当前读入的运算符优先级,则弹出栈顶运算符,同时从数栈弹出相应数量的操作数进行运算,将运算结果压入数栈,最后把当前运算符压入运算符栈。
2. 如果运算符栈顶的运算符优先级低于当前读入的运算符的优先级,则直接压入当前运算符到运算符栈。
3. 如果当前运算符为' ) ',则弹出运算符栈中的运算符进行相应的运算,直到弹出的运算符是' ( ' 为止。
4. 如果当前运算符为' ( ',则直接把' ( '压入运算符栈

要注意:这种算法在完成了 分词结果 的扫描之后,大多数情况下会在运算符栈和数符栈中留下未运算的运算符和数符,因此要依次弹出运算符和数符进行运算,直到栈顶出现#为止,因此在表达式中最后不使用#结尾,否则可能导致提前结束运算。

下面我们来看看用该优先级表进行运算的例子

表达式:1*2+(9-4)/5

步骤数栈

运算符栈

当前输入符号剩余表达式说明
1# 1*2+(9-4)/5
2# 1 *2+(9-4)/5
31# *2+(9-4)/5#优先级P0,*优先级P2,#的优先级<*的优先级,push(*)
41 # *2+(9-4)/5
51 2# *+(9-4)/5+优先级P1,*优先级P2,*的优先级>+的优先级,pop(*),pop(1),pop(2),计算1*2=2,把结果2压入数栈
62# +(9-4)/5
72# + (9-4)/5
82 9# + (-4)/5-的优先级> ( 的优先级,push(-)
92 9# + ( -4)/5
102 9 4# + ( -)/5遵循规则3,见上面的“我们规定……”
112 5# +/5+ 优先级 < / 优先级
122 5# + /5
132 1# +因为栈顶不为#,所以计算5/5=1,push(1)
143# 因为栈顶不为#,所以计算1+2=3,push(3)
153#栈顶为#,完成


该优先级表可能存在一定的局限性,大家有兴趣的话可以探讨一下。

*********************** Update on 2005.5.14 *************************
为了说明该种优先级表的局限性,我们来看一个例子。
我们的表达式可能需要处理这样的情况:#cos sin 1#
该表达式中我们应该先计算sin1,再计算cos(sin 1),但根据该表的运算规则,我们会得到如下的运算步骤

步骤数符栈 运算符栈 当前符号 剩余表达式说明
1#cos sin1
2# cos sin 1
3# cossin1sin的优先级=cos的优先级,对cos进行运算
4# sin出错,因为数符栈为空,cos缺少可以弹出的数符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值