[英]Reduce number of parentheses for a binary expression tree
我有一個函數,該函數接收二進制表達式樹,並按順序返回帶有表達式的String。 唯一的“問題”是,結果表達式的括號過多,
例如:函數返回(a +(b * c)),但可以將其簡化為a + b * c。
它由二進制運算符+,-,*,/和一元運算符_(負)定義。
我真正想知道的是,我是否可以修改現有的函數以有效地減少括號的數量,還是創建另一個對有序表達式的String進行操作的函數。
功能如下:
private static String infijo(ArbolB t){
String s = "";
if (t != null) {
String info = String.valueOf(t.info);
if ("+-*/".contains(info)) s += "(";
if ("_".contains(info)) s += "-(";
s += infijo(t.left) + (info.equals("_") ? "" : info) + infijo(t.right);
if ("+-*/_".contains(String.valueOf(t.info))) s += ")";
}
return s;
}
其中ArbolB是由以下項定義的二叉樹:
public class ArbolB {
ArbolB right;
ArbolB left;
Object info;
public ArbolB(Object info, ArbolB right, ArbolB left){
this.info = info;
this.right = right;
this.left = left;
}
}
將整個內容寫完之后,我意識到我並沒有真正正確地回答您的問題(我的解決方案忽略了PEMDAS,只是配對了,噢!)。 因此,從中獲取您所能...我不會把它扔掉:P
我認為您可以通過任何一種方式解決此問題,但這將是我的首選方法,使用並信任您已經擁有的內容。 使用節點執行此操作可能是一種好方法,但是為什么不使用現有資源呢?
從將表達式表示為字符串的點開始(例如“(((2 * 2)+ __(3 + 3)))”),可以嘗試以下操作:
public string RemoveUnnecessaryParens(string expression)
{
readonly string openParen = "(";
readonly string closeParen = ")";
// char array would also work for this
// multiple ways to track "balance" of parens, lets use int
int unclosedParenCount = 0;
string toReturn = "";
// iterate through the expression
for (int i = 0; i < expression.Length; i++)
{
string current = expression.Substring(i,1);
if (openParen == current)
unclosedParenCount++;
else if (closedParen == current)
unclosedParenCount--;
else
toReturn += current;
if (unclosedParenCount < 0) throw new UnbalancedExpressionException(); // One more close than open! Uh oh!
}
if (0 != unclosedParenCount) throw new UnbalancedExpressionException(); // One more open than close at the end! Uh oh!
else return toReturn;
}
說得通?
好了,考慮了一會兒之后,我自己解決了一個問題,添加了一個優先級函數來確定何時需要使用括號,並添加了一個變量,該變量指示操作是在公式的左側還是右側,這是因為-b + c不需要括號,但是c +(ab)確實需要括號。
private static String infijo(ArbolB t, int priority, boolean right) {
String s = "";
int oP = 0;
if (t != null) {
String info = String.valueOf(t.info);
int pi = priority(info);
if ("+-*/".contains(info)) {
/* this only adds parentheses if the operation has higher priority or if the
operation on the right side should be done before the one on the left side*/
if ("+-*/".contains(info)) {
if (pi/2 < priority/2) s += "(";
else s += pi/2 == priority/2 && pi != priority && right ? "(" : "";
oP = priority; //stores the old priority
priority= pi; //priority of the new operator
}
}
if ("_".contains(info)) {
s += "-";
oP = priority;
priority = pi;
}
s += infijo(t.left, priority, false) + (info.equals("_") ? "" : info)
+ infijo(t.right, priority, true);
if ("+-*/".contains(info)) {
// adds the closing parentheses following the same rules as for the opening ones
if (priority / 2 < oP / 2) s += ")";
else s += priority / 2 == oP / 2 && priority != oP && right ? ")" : "";
}
}
return s;
}
private static int priority(String op) {
if ("_".contains(op)) return 4;
if ("/".contains(op)) return 3;
if ("*".contains(op)) return 2;
if ("-".contains(op)) return 1;
return 0;
}
@Override
public String toString() {
ArbolB f = getFormula(); //this returns the Binary Expression Tree
return infijo(f, Integer.MIN_VALUE, false);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.