Моя программа должна получить уравнение (например: x^4 * (x + 3)) и преобразовать его в пост-порядок (или обратную полировку), после чего мне нужно создать дерево, которое должен быть помещен в стек. Трудная часть читается через уравнение порядка после заказа. В примере он должен быть:Деревья в стеке
х 4^х 3 + *
Таким образом, правила о создании дерева является:
Если это бинарная операция ("+", "-",»^","/"," * ") он должен взять первые 2 элемента стека, создать дерево с операцией в качестве корня и числа в качестве своих сыновей и вставить его в стек.
Если это унарная операция («&», которая представляет собой ln, «~», которая представляет отрицательный (~ 3) = (- 3)), то shoudl берет первый элемент стека, создает дерево с как корень, и число как его сын, и вставлять его в стек.
Если это число или буква, он должен создать узел без сыновей и просто вставить его в стек.
Моего алгоритма обнаружение, если это письмо, двоичные или унарные операции через строку: (Уравнение Post заказа уже создано, он был послан моим учителем, так что нет ничего, чтобы изменить там)
String aux="";
for (int i=0; i < nuevaF.length();i++){
char c = nuevaF.charAt(i);
if (c!=' '){
aux=aux+c;
System.out.println(aux);
}
if (c==' '){
System.out.println("space");
Transformar(stack,aux);
aux="";
}
}
А затем создать стек:
public static void Transformar(PilaArreglo stack, String ecuacion){
if (ecuacion=="+"||ecuacion=="-"||ecuacion=="*"||ecuacion=="/"||ecuacion=="^"){
Nodo aux1 = stack.desapilar();
Nodo aux2 = stack.desapilar();
Nodo total = new Nodo(ecuacion,aux2, aux1);
System.out.println("hole");
stack.apilar(total);
}
else if (ecuacion=="&"||ecuacion=="~"){
Nodo aux1 =stack.desapilar();
Nodo total2 = new Nodo(ecuacion,aux1);
System.out.println("holo");
stack.apilar(total2);
}
else{
Nodo total3 = new Nodo(ecuacion);
System.out.print("hele");
stack.apilar(total3);
}
}
Моя проблема заключается в том, что он не обнаруживает, если это бинарная операция или нет. Он немедленно переходит к другому. Я печатаю Hole, holo и hele, чтобы увидеть, куда идут элементы, но все, что я получаю, это hele.
x
hele4
hele^
helex
hele3
hele+
hele*
Я действительно не знаю, почему это пропуск других IFS, если это бинарная операция или унарный. На всякий случай, вот класс Tree
public class Nodo{
Object element;
Nodo izq;
Nodo der;
Nodo(String x, Nodo y, Nodo z){
element = x;
izq = y;
der = z;
}
Nodo(String x, Nodo y){
element = x;
izq = y;
der = null;
}
Nodo(String x){
element = x;
izq = null;
der = null;
}
}
И Stack (должен быть стопка Узлов)
class PilaArreglo{
private Nodo[] arreglo;
private int tope;
private int MAX_ELEM=100; // max numbers on stack
public PilaArreglo(){
arreglo=new Nodo[MAX_ELEM];
tope=-1; // empty stack
}
public void apilar(Nodo x){
if (tope+1<MAX_ELEM){ // if full, OVERFLOW
tope++;
arreglo[tope]=x;
}
else{
MAX_ELEM=MAX_ELEM*2;
Nodo[] nuevo_arreglo=new Nodo[MAX_ELEM];
for (int i=0; i<arreglo.length; i++){
nuevo_arreglo[i]=arreglo[i];
}
tope++;
nuevo_arreglo[tope]=x;
arreglo=nuevo_arreglo;
}
}
public Nodo desapilar(){
if (!estaVacia()){ // si esta vacia se produce UNDERFLOW
Nodo x=arreglo[tope];
tope--;
return x;
}
return null;
}
public Nodo tope(){
if (!estaVacia()){ // si esta vacia es un error
Nodo x=arreglo[tope];
return x;
}
return null;
}
public boolean estaVacia(){
if (tope==-1)
{
return true;
}
else
{
return false;
}
}
Я ценю каждую помощь вы можете дать мне.
Спасибо, это очень помогло. И мне также пришлось изменить много материала, чтобы он работал. Оценил! – Kyle
Кайл, вы можете нажать зеленый флажок, чтобы принять мой ответ – fdsa