2015-09-15 3 views
0

Я пытаюсь сделать некоторый смысл следующих инструкций, используя подпрограмму:Оценка математического выражения в Postfix (RPN) Java. Нет стека, только строки

я = 1

в то время как я < = п

если v_i является операнд: принудительную v_i - tmp2.

Если v_i является оператором: Примените v_i к двум верхним элементам tmp2. Замените их результатом tmp2.

i = i + 1 Результат вывода из tmp2.

Так что в основном я пытаюсь вычислить некоторое выражение в форме postfix (RPN). Здесь я хочу, чтобы всякий раз, когда цифра является операндом (числом), который должен быть передан в tmp2, и когда оператор возвращает его за счет таузера в tmp2. например 3 5 1 +8/14 * = 14

Другие проблемы: что бы я ни писал, я получаю сообщение об ошибке «Исключение в потоке» главной «java.lang.StringIndexOutO ....». v_i - это цифра или оператор или круглые скобки.

СПАСИБО В РАМКАХ!

Мой код:

static int eval(String postfix){ 
    int result = 0; 
    String temp2 =""; 

    for (int i=0 ; i<postfix.length(); i++) { 
     if (postfix.charAt(i) !=')' && postfix.charAt(i)!= '(' && postfix.charAt(i)!= p(infix.charAt(i))) 
      temp2 += postfix.charAt(i); 

     int num1,num2; 
     char operator; 

      do { 
       i++;    
      } while (Character.isDigit(postfix.charAt(i))); 

      num1 = Integer.parseInt(postfix.substring(0,i)); 
      operator = postfix.charAt(i++); 
      num2 = //Double.parseDouble(expression.substring(i)); 
       Integer.parseInt(postfix.substring(i+1)); 



      result = num1 + num2; 
      result = num1 - num2; 
      result = num1 * num2; 
      result = num1/num2; 

      switch (operator) { 

      case '+' : result = num1 + num2; break; 
      case '-' : result = num1 - num2; break; 
      case '*' : result = num1 * num2; break; 
      case '/' : result = num1/num2; break; 



      } 


    } 




    return result; 
} 
+0

Вы не можете оценить постфикс или любой другой тип -fix без стека. Неясно, что вы спрашиваете. Ожидаете ли вы каким-то образом использовать строку в виде стека? Если да, то почему? – EJP

ответ

0

Это означает, что вы пытаетесь получить доступ символа за пределами вашего массива символов, то есть длина вашего массива полукокса 10 и вы пытаетесь получить 11-й символ.

Лучший подход к вашей проблеме будет первым разметить ваше выражение, используя либо String.split или StringTokenizer StringTokenizer, затем петлю через каждый знак:

  • если маркер является операнд толчок в Stack --Java имеет класс Stack, поэтому используйте это.
  • если токен является оператором, поп операндов из стека и выполнить операцию, нажмите ответ обратно в стек.
+0

Спасибо! Но точка назначения заключается в использовании манипуляции с String. –

+0

Я бы сказал, что String.split или StringTokenize - это способы манипулирования строками. Если вам нужно прокрутить каждый символ и не использовать Stack для оценки вашего выражения, я думаю, вы тратите свое время. Никто в здравом уме не должен ожидать, что вы это сделаете. – user3038723