Проверить, является ли элемент в стеке числом или оператором?

Я пытаюсь создать калькулятор RPN с помощью сканера. Я собираю числа и операторы от пользователя и объединяю входные данные в строку под названием results, Как только они выходят (говоря "Q" или "Q"), я хотел бы передать results к методу evaluateResults, который будет выполнять операции, которые они ввели. Например, если строка передана evaluateResults "45+", я хотел бы добавить 4 и 5. Однако, если вход "456+ х", я хотел бы выполнить (4 + 5) х 6', то есть я читаю строку до символ является оператором, затем я выполняю этот оператор с первыми двумя числовыми символами строки... Я пытаюсь сделать это с помощью следующей программы:

import java.util.*;

/**
  This calculator uses the reverse Polish notation.
*/
public class P15_7 {

  public static void evaluateResult(String inp){
    int output = 0;
    Stack<Integer> results = new Stack<>();
    for (int i = 0; i < inp.length(); i++){
      char c = inp.charAt(i);   
      if (Character.isDigit(c)){
        results.push(Character.getNumericValue(c));
      }else{
        Iterator<Integer> itr = results.iterator();
        while(itr.hasNext()){
          if (c == '+'){
            int f = itr.next();       // Getting the First value of the Stack
            itr.remove();             // Removing it (first val)
            int s = itr.next();       // Getting the Second value of the Stack
            itr.remove();             // Removing it (second val)
            output = output + (f + s);// calculate
            itr = results.iterator(); // Starting the iterator back at Index 0
            itr.add(output);          // Adding the calculated value at the start : Index 0
          }else if (c == '-'){
            int f = itr.next();
            itr.remove();
            int s = itr.next();
            itr.remove();
            output = output + (f - s);
            itr = results.iterator(); 
            itr.add(output); 
          }else if (c == '*' || c == 'x'){
            int f = itr.next();
            itr.remove();
            int s = itr.next();
            itr.remove();
            output = output + (f * s);
            itr = results.iterator();
            itr.add(output);
          }else if (c == '/'){
            int f = itr.next();
            itr.remove();
            int s = itr.next();
            itr.remove();
            output = output + (f / s);
            itr = results.iterator();
            itr.add(output);
          }
        }
      }
    }
    System.out.println("You answer is: " + output);
  }
  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String results = "";
    System.out.println("Enter one number or operator per line, Q to quit. ");
    boolean done = false;

    while(!done){
      String input = in.nextLine();
      if(input.equals("Q") || input.equals("q")){
        evaluateResult(results);
        done = true;
      }else{
        results = results.concat(input);
        System.out.println(results);
      }
    }
  }
}

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить инт output добавить в начало стека с использованием итератора. Как я могу изменить этот код для выполнения метода, как я описал его выше? Любые изменения будут полезны, и, пожалуйста, дайте мне знать, если мне что-то неясно, и я уточню.

1 ответ

Вот основной процесс интерпретации RPN, описанный в псевдокоде:

while (more input available) 
{
    get next input synbol S
    if (S is a number)
        push S on the Stack
    else // S must be an operator
    {
        pop the top item from Stack into op2
        pop the (new) top item from Stack into op1
        compute the result R by performing the operation named by S
           on op1 and op2 
        push R on the stack
    }
}
pop the final result from the Stack
Другие вопросы по тегам