调车场算法实现中优先值的含义

时间:2014-08-02 03:00:22

标签: java shunting-yard

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

我是数据结构的新手,如果没有指南就无法对此进行编码,所以经过研究后我在网上找到了几个例子,并且其中一个例子发现here。其他网站,如果您有兴趣:12。我选择了第一个链接网站,因为我理解这三个网站中最好的。

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

/** 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算法实现,请提出建议!)

1 个答案:

答案 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%-