我正在编写一个计算器类来学习Java。截至目前,它可以处理简单的函数,如2+2
,2^2
等,但我正在尝试实现Shunting Yard算法,以便它可以处理更复杂的表达式。
我是数据结构的新手,如果没有指南就无法对此进行编码,所以经过研究后我在网上找到了几个例子,并且其中一个例子发现here。其他网站,如果您有兴趣: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};
我知道这与运营商的优先级有关,但我不确定这些数字的来源。请有人澄清一下吗?
另外,我的计算器有一个指数方法,作者没有提供。如果我要包含它,除了End of Stream / EOS和默认选项之外,它是否会优先于所有内容?
(如果您有更好的Shunting Yard算法实现,请提出建议!)
答案 0 :(得分:1)
这些值取自Horowitz Sahni的数据结构precedence hierarchy in c
。请检查 。您可以按优先顺序输入自己的号码。例如
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%-