Преобразование из инфикса в постфикс с использованием строк, массивов и стеков - PullRequest
0 голосов
/ 03 марта 2020

В основном мне нужно сделать так, чтобы код превращал инфиксные уравнения в постфиксные, поэтому вот что я получил:

//Generics
public class Stack<T> {

    private int maxStkSize = 100;
    private int top = -1;
    private Object[] stk;

    public Stack() {
        stk = new Object[maxStkSize];
    }

    public Stack(int n) {
        if (n > 0) {
            maxStkSize = n;
        }
        stk = new Object[maxStkSize];
    }

    public boolean isEmpty() {
        return (top == -1);
    }

    public boolean isFull() {
        if ((stk.length - 1) == maxStkSize) {
            return true;
        }
        return false;
    }

    public int push(T el) {
        if (isFull())
            return -999;
        stk[++top] = el;
        return 1;
    }

    public T pop(){
        if (isEmpty()) return null;
        T el = (T) stk[top--];
        return el;
    }

    public T peek(){
        T el = (T) stk[top];
        return el;
    }   
}

public class ArraysAndStacks {

    static String infixToPostfix(String e) {
        String[] arrayVar = e.split(" ");
        Stack<String> s = new Stack();
        String A,B;
        for (int i = 0; i < arrayVar.length; ++i) {
            if (arrayVar[i].equals("("))
                s.push(arrayVar[i]);
            else if (arrayVar[i].equals("^")){
                String top = s.peek();
                if (!top.equals("*") && !top.equals("/") && !s.isEmpty() && !top.equals("("))
                s.push(arrayVar[i]);
            }else if (arrayVar[i].equals("*") || arrayVar[i].equals("/")){
                if (s.isEmpty())
                    s.push(arrayVar[i]);
                else{ 
                    String top = s.peek();
                    if (!top.equals("+") && !top.equals("-") && !s.isEmpty() && !top.equals("(") &&
                            !s.isEmpty())
                    s.push(arrayVar[i]);    
                }
            }else if (arrayVar[i].equals("+") || arrayVar[i].equals("-")){
                if (s.isEmpty())
                    s.push(arrayVar[i]);
                else{
                    String top = s.peek();
                    if (!s.isEmpty() && !top.equals("("))
                    s.push(arrayVar[i]);}
            }else if (arrayVar[i].equals(')')){
                String top = s.peek();
                A = s.pop();
                if (top.equals("(") && !s.isEmpty()){
                    s.pop();
                    if (top.equals("+") || top.equals("-") || top.equals("/") ||
                        top.equals("*") || top.equals("^")){
                        B = s.pop();
                        C = s.pop();
                        s.push(C+A+B);
                    }else if (!top.equals("+") && !top.equals("-") && !top.equals("/") &&
                        !top.equals("*") && !top.equals("^"))
                        B = s.pop();
                        C = s.pop();
                        //s.push(B+A); //PROBLEM WITH ")" symbol, does not compute 4 / () in the equation

                }
            }else if (!arrayVar[i].equals("+") && !arrayVar[i].equals("-") &&
                    !arrayVar[i].equals("*") && !arrayVar[i].equals("/") &&
                    !arrayVar[i].equals("^") && !arrayVar[i].equals(")")){
                String top = s.peek();
                if (top.equals("("))
                    s.push(arrayVar[i]);
                else{
                    if(top.equals("+") || top.equals("-") || top.equals("*") ||
                            top.equals("/") || top.equals("^") || 
                            top.equals(")")){
                    B = s.pop();
                    A = s.pop();
                    s.push (A + arrayVar[i] + B);
                }
                }
            }           

    }
     return s.pop();
    }

Кодирование работает, но вывод не такой, как ожидалось, если я ввод уравнение (4/(9-8+5)*3) программа выводит 98-5+3* вместо правильного ответа 498-5+/3*32^^

Я открыт для предложений, поскольку я пробовал много вещей чтобы по возможности это исправить, я не хочу использовать для этого char, так как было указано, что мы делаем это таким образом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...