как обрабатывать спина к спине символы в постфиксной нотации - PullRequest
0 голосов
/ 15 октября 2018

как вы учитываете два символа подряд при использовании нотации стека и постфикса?Я преобразовал свое постфиксное уравнение в строку, а затем пытался учесть, является ли это символ или число, и складывал числа в стек.Мое первое уравнение работает нормально, но из-за того, что два персонажа идут вплотную во втором, оно не выполняется.Когда я сталкиваюсь со вторым, у него нет двух чисел, чтобы использовать нотацию постфикса из-за отсутствия числа для чтения после помещения последнего в стек.Любая помощь приветствуется.

import java.util.Stack;
import java.util.EmptyStackException;
import java.util.Queue;

public class postFixCalc extends Program2Test{
    static Program2Test<Integer> calcStack = new Program2Test<>();

    private static int calc1(String exp) {
        Stack<Integer> calc1Stack = new Stack<>();

        try {
        for(int i = 0; i<exp.length(); i++) {
            char c = exp.charAt(i);
            if(Character.isDigit(c))
                calc1Stack.push(c-'0');
            else {
                int val1 = 0;
                int val2= 0;
                if(!calc1Stack.isEmpty()) {
                val1= calc1Stack.pop();
                val2= calc1Stack.pop();}

                switch(c){
                    case '+':
                        calc1Stack.push(val2+val1);
                        break;

                    case '-':
                        calc1Stack.push(val2-val1);
                        break;

                    case '/':
                        calc1Stack.push(val2/val1);
                        break;

                    case '*':
                        calc1Stack.push(val2*val1);
                        break;
                }
            }
        }
        }
        catch(EmptyStackException e) {
            System.out.println("Your stack is empty");      }
        return calc1Stack.pop();
    }
    public static void main(String[] args) {

        // TODO Auto-generated method stub
        String exp = "12+4*5-";     
        System.out.println("Your Answer is: " + calc1(exp));
        System.out.println("");
        String exp2 = "12*4*1-/53+";
        System.out.println("Your answer is: " + calc1(exp2));



    }

}

1 Ответ

0 голосов
/ 15 октября 2018

Из моего понимания постфиксной нотации ваше выражение exp2 на самом деле недопустимо.Вы оцениваете выражения postfix, оценивая операции слева направо.Итак, чтобы вручную вычислить выражение 12*4*1-/53+, мы делаем следующее:

Начиная слева, мы сканируем выражение, пока не найдем первый оператор *.Затем мы оцениваем два непосредственных предыдущих операнда, 1 и 2, с помощью оператора * и заменяем эти 3 входных значения на выход, получая 24 * 1- / 53 +.Теперь повторите процесс.

Сканируем слева и находим оператора *.Мы оцениваем его по двум предыдущим операндам, 2 и 4, и снова заменяем входы на выход, получая 81- / 53.Повторите.

На этот раз мы доберемся до оператора -.Мы оцениваем его по двум предыдущим операндам, 8 и 1, и заменяем входные данные выходными, получая.7/53 +.Повторите.

Мы сканируем, чтобы найти оператор /.Но ждать!Слева от оператора есть только один операнд.Это не разрешено, что означает, что ваш ввод неверен.

...