2013-07-03 1 views
0
static String convert(String exp) 
    { 
    String result=""; 
    Stack s1=new Stack(); 
    for(int i=0;i<exp.length();i++) 
     { 
     if(Character.isDigit(exp.charAt(i))) 
     {{ 
     result=result+exp.charAt(i); 
     continue; 
     } 
     else 
     { 
     if(s1.empty()) 
     { 
     s1.push(exp.charAt(i)); 
      continue; 
     } 
     else 
     { 
     if(check(exp.charAt(i))>check(exp.charAt(i-1))) 
     s1.push(exp.charAt(i)); 
     else 
     { 
     while(!s1.empty()) 
     { 
     String a=s1.pop().toString(); 
     result=result+a; 
     } 
     s1.push(exp.charAt(i)); 
     } 
     } 
     } 
    } 
    while(!s1.empty()) 
    { 
    String p=s1.pop().toString(); 
    result=result+p; 
    } 
    return result; 
    } 

    static int check(char c) 
    { 
    switch (c) { 
      case '+': 
      case '-': 
       return 0; 
      case '*': 
      case '/': 
       return 1; 
      case '^': 
       return 2; 
      default: 
       throw new IllegalArgumentException("Operator unknown: " + c); 
      } 
    } 

Вот мой код для преобразования выражения из infix в постфикс. Этот код работает нормально только с двумя операндами. Для более чем 2 операндов, таких как 6 + 9 * 7, он показывает IllegalArgumentException, которое я дал другим способом для определения приоритетов операторов. Пожалуйста, помогите мне уточнить, где я ошибаюсь?ошибка в заданном коде для инфикса для постфиксного преобразования для ввода, содержащего более двух операндов

+0

Пожалуйста отступы ваш код, это трудно читать как что .. – Maroun

ответ

0
  1. Отступ код
  2. В трассировке стека:

    at Test.convert(Test.java:21) 
    

    Является ли эта линия:

    if(check(exp.charAt(i))>check(exp.charAt(i-1))) 
    

    Так что я думаю, что вы имеете в виду:

    if (check(exp.charAt(i)) > check(s1.peek())) 
    
  3. Теперь «Проверка метода (char) в типе Test не применима для аргументов (Object)», поэтому параметризован ваш Stack. То есть, изменение:

    Stack s1=new Stack(); 
    

    К (в Java 7):

    Stack<Character> s1 = new Stack<>(); 
    
+0

еще один - используйте StringBuilder вместо строк конкатенации в цикле – iMysak

+0

@ johnchen902 Это сработало! Большое спасибо – user2492165

+0

@iMysak Я согласен. – johnchen902

0

Вы получаете это исключение из вашей логики. Рассмотрим 1 + 2 * 3. В этом случае, когда вы получаете 3 ниже код запускается на выполнение:

else 
{ 
if(check(exp.charAt(i))>check(exp.charAt(i-1))) 
s1.push(exp.charAt(i)); 

И проверьте (3) приводит к

default: 
      throw new IllegalArgumentException("Operator unknown: " + c);