я пытаюсь создать рекурсивный метод для разделения строки, которая является выражением инфикса, я использую 2 очереди и 1 стек для использования алгоритма шунтирования-ярда , проблема в том, что я запутался, разделяя инфиксвыражение из скобок, например:
3 + (12+ (8/2)) -> 3+ | (12+ | (8/2) |) |
У меня уже есть код, чтобы переписать выражение в postfix, а затем оценить выражение, но я хочу сделать рекурсивный метод, который сначала переписывает выражение в скобках для обозначения приоритета, не принимая скобки:
(8/2) ---> 8/2 ---> 82 /
это то, что я мог сделать, но я очень запутался в своем рекурсивном методе, оченьблагодарны за любую помощь или совет, который вы, ребята, могли бы дать мне:
public class infijoToPosfijo {
private static int preference(String op) {
int prf = 0;
if (op.equals("*") || op.equals("/") || op.equals("%")) {
prf = 2;
}
if (op.equals("+") || op.equals("-")) {
prf = 1;
}
return prf;
}
public String Recursive(String Recursive) {
IterableQueueListas<String> input= new IterableQueueListas<>();
IterableQueueListas<String> output = new IterableQueueListas<>();
IterableStacksListas<String> stack = new IterableStacksListas<>();
String infix="";
String separate[] = infix.split("(?=[-+*/%()])|(?<=[^-+*/%][-+*/])|(?<=[()])");
for (int i = 0; i < separate.length; i++) {
if (separate[i] == "(") {
int a = 0;
do {
if (separate[i].equals("(")) {
a++;
}
if (separate[i].equals(")")) {
a--;
}
input.enqueue(separate[i]);
} while (a != 0);
for (String item : input) {
Recursive = input.dequeue();
Recursive(Recursive);
}
input.enqueue(separate[i]);
}
for (String item : input) {
String s = input.dequeue();
if (!s.equals("+")) {
if (!s.equals("-")) {
if (!s.equals("*")) {
if (!s.equals("/")) {
if (!s.equals("%"))
output.enqueue(s);
}
}
}
}
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("%")) {
if (stack.isEmpty()) {
stack.push(s);
} else if (preference(s) > preference(stack.ver())) {
stack.push(s);
} else if (preference(s) <= preference(stack.ver())) {
String auxDos = stack.pop();
output.enqueue(auxDos);
stack.push(s);
}
}
}
for (String item : stack) {
output.enqueue(stack.pop());
}
input = output;
for (String item : input)
System.out.print(item + " ");
System.out.println();
// Evaluate infix expression
for (String item : output) {
String s = input.dequeue();
if (!s.equals("+")) {
if (!s.equals("-")) {
if (!s.equals("*")) {
if (!s.equals("/")) {
if (!s.equals("%")) {
stack.push(s);
System.out.println("Sending the " + s + " to the stack");
}
}
}
}
}
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("%")) {
String y = stack.pop();
String x = stack.pop();
System.out.println("Operation " + x + " y " + y);
if (s.equals("+")) {
System.out.println("Add the numbers");
int r = Integer.parseInt(x) + Integer.parseInt(y);
stack.push(String.valueOf(r));
}
if (s.equals("-")) {
System.out.println("Subtract the numbers");
int r = Integer.parseInt(x) - Integer.parseInt(y);
stack.push(String.valueOf(r));
}
if (s.equals("*")) {
System.out.println("Multiply the numbers");
int r = Integer.parseInt(x) * Integer.parseInt(y);
stack.push(String.valueOf(r));
}
if (s.equals("/")) {
System.out.println("se dividen los numeros");
int r = Integer.parseInt(x) / Integer.parseInt(y);
stack.push(String.valueOf(r));
}
if (s.equals("%")) {
System.out.println("Modulus between the numbers");
int r = Integer.parseInt(x) % Integer.parseInt(y);
stack.push(String.valueOf(r));
}
}
}
return stack.pop();}
return infix;
}