Мне нужно кодировать преобразование RPN в Infix в java, но я борюсь с этим довольно много.
Операторы, которые вы можете использовать в выражениях: '='
, '>,<'
, '+,-'
, '*,/,%'
, '^'
, '~'
, '(,)'
.
Единственный импорт, который я могу использовать, это import java.util.Scanner
.
Моя основная проблема заключается в том, что мой алгоритм отображает преобразованное выражение со слишком большим количеством скобок, в то время как я должен отображать их минимальное количество. Для выражения: xabc**=
вывод равен x=(a*(b*c))
, но должен быть x=a*(b*c)
.
Я присоединяю свой класс стека и класс основного преобразования. Спасибо за вашу помощь!
public static class Stack<E> {
private E[] elem;
public int top;
Stack(int s) {
elem = (E[])new Object[s];
top = -1;
}
public void push(E ch) {
elem[++top] = ch;
}
public E pop() {
E pom = elem[top];
top--;
return pom;
}
public boolean isEmpty() {
if (top == -1) return true;
else return false;
}
public int size() {
return top + 1;
}
}
public static String onp_do_inf(String onpForm) {
Stack<String> stos = new Stack<String>(onpForm.length() * 3);
String operator1 = null, operator2 = null;
stos.push("0");
for (int i = 0; i < onpForm.length(); i++) {
char x = onpForm.charAt(i);
if (x != '+' && x != '-' && x != '='
&& x != '*' && x != '/'
&& x != '%' && x != '^' && x != '<' && x != '>' && x != '~') {
stos.push(Character.toString(onpForm.charAt(i)));
} else if ((stos.size() - 2) > 0) {
if (x == '~') {
operator1 = stos.pop();
stos.push(x + operator1);
} else {
operator1 = stos.pop();
operator2 = stos.pop();
if ((stos.top == 0 && x == '=')) {
stos.push(operator2 + x + operator1);
}
else if ( stos.top == 0){
stos.push(operator2 + x + operator1);
}
else if ((x == '/') || (x == '*' && stos.top > 1)
|| (x == '%' && stos.top == 1) || (x == '<')
|| (x == '>') || (x == '^' && stos.top >= 1) || (x == '=')) {
stos.push(operator2 + x + operator1);
} else {
stos.push("(" + operator2 + x + operator1 + ")");
}
}
}
}
return stos.pop();
}