0

我正在编写一个计算器类来学习 Java。到目前为止,它可以处理简单的函数,例如2+2,2^2等,但我正在尝试实现 Shutting Yard 算法,以便它可以处理更复杂的表达式。

我是数据结构的新手,没有指南就无法编写这样的代码,因此经过研究,我在网上找到了几个示例,并正在关注其中的一个。其他网站,如果您有兴趣:1 , 2。我选择了第一个链接站点,因为我对它的理解是三个中最好的。

但我不明白作者在这里做什么:

/** in stack precedence **/
private static final int[] isp = {0, 19, 12, 12, 13, 13, 13, 0};
/** incoming character precedence **/
private static final int[] icp = {20, 19, 12, 12, 13, 13, 13, 0};

我知道这与运算符的优先级有关,但我不确定这些数字来自哪里。有人可以澄清一下吗?

另外,我的计算器有一个作者没有包含的指数方法。如果我要包含它,它是否会比除了流结束/EOS 和默认选项之外的所有内容具有更高的优先级?

(如果你有更好的调车场算法实现,请提出建议!)

4

1 回答 1

1

这些值取自precedence hierarchy in cHorowitz Sahni 的数据结构。请检查 。您可以输入自己的号码,但按优先顺序。例如

private static final int[] isp = {0, 3, 1, 1, 2, 2, 2, 0};

private static final int[] icp = {4, 3, 1, 1, 2, 2, 2, 0};

要添加您的电力运营商,请进行以下更改

lparen(0), rparen(1), plus(2), minus(3), divide(4), times(5), mod(6), eos(7), pow(8), operand(9) ;


// Giving ^ (custom power) operator more precedence (14) than other (+,-,*,/,%) operators

/** in stack precedence **/
private static final int[] isp = {0, 19, 12, 12, 13, 13, 13, 0, 14};
/** incoming character precedence **/
private static final int[] icp = {20, 19, 12, 12, 13, 13, 13, 0, 14};
/** operators **/    
private static final char[] operators = {'(', ')', '+', '-', '/', '*', '%', ' ', '^'};
//                                        ^    ^ typo with '{' and '}'

加入开关

case '^'  : return Precedence.pow;

输出 :

Shunting Yard Algorithm Test

Enter infix expression
1+2*3^4/5-6%7

Postfix expression : 1234^*5/+67%-
于 2014-08-02T03:35:21.227 回答