2015-12-15 11 views
-2

Мне нужна помощь с этой программой, потому что она не компилируется правильно.Postfix для программы Infix, которая нуждается в исправлении

Программа должна делать это:

java PostfixToInfix 
1 2 3 + * 
1*(2+3) 

Я получаю эти ошибки при компиляции:

PostfixToInfix.java:64: error: bad operand types for binary operator '-' 
         s.push(o2 - o1); 
           ^
    first type: String 
    second type: String 

PostfixToInfix.java:68: error: bad operand types for binary operator '*' 
         s.push(o1 * o2); 
           ^
    first type: String 
    second type: String 
2 errors 

Сколько я должен закодировать это так, что он работает должным образом? Я не уверен, что не так с моим кодом, что он не позволяет ему правильно выполнять функции. Это мой код:

import java.util.Scanner; 
import java.util.Stack; 
public class PostfixToInfix 
{ 
    public static void main(String[] args) 
    { 
     String[] input = readExpr();   
     if(checkSyntax(input) == true) 
     { 
      int k = 0; 
      Stack<String> s = new Stack<>(); 
      for(int i = 0; i < input.length; ++i) 
      { 
       if(isOperator(input[i])) 
       { 
       String o1; 
       String o2; 
        if(!(s.empty())) 
        { 
         o1 = s.pop(); 
        } 
        else 
        { 
        for(int j = 0; j < i; ++j) 
         { 
         k += input[j].length() + 1; 
         } 
        System.out.println("Too few operands for " + input[i]); 
        writeExpr(input); 
         for(int l = 0; l < k; ++l) 
         { 
         System.out.print(" "); 
         } 
        System.out.println("^"); 
        return; 
        } 
        if(!(s.empty())) 
        { 
         o2 = s.pop(); 
        } 
        else 
        { 
         for(int j = 0; j < i; ++j) 
         { 
         k += input[j].length() + 1; 
         } 
        System.out.println("Too few operands for " + input[i]); 
        writeExpr(input); 
        for(int l = 0; l < k; ++l) 
        { 
        System.out.print(" "); 
        } 
        System.out.println("^"); 
        return; 
        } 
        if(input[i].equals("+")) 
        { 
         s.push(o1 + o2); 
        } 
        else if(input[i].equals("-")) 
        { 
         s.push(o2 - o1); 
        } 
        else 
        { 
         s.push(o1 * o2); 
        } 
       } 
       else 
       { 
       s.push(input[i]); 
       } 
      } 
      String Result = s.pop(); 
      if(!(s.empty())) 
      { 
       System.out.println("Too few operators to produce a single result"); 
      } 
      else 
      { 
       System.out.println(Result); 
      } 

     } 


    } // end main 

    static String[] readExpr() 
    { 
     Scanner stdin = new Scanner(System.in); 
     String s = stdin.nextLine(); 

     String[] sA = s.split(" "); 
     return sA; 

    } 

    static void writeExpr(String[] expr) 
    { 
     for(int i = 0; i < expr.length; ++i) 
     { 
      System.out.print(expr[i] + " "); 
     } 
     System.out.println(); 

    } 

    static boolean isOperator(String s) 
    { 
     if(s.equals("+") || s.equals("-") || s.equals("*")) 
     { 
      return true; 
     } 
     return false; 
    } 

    static boolean checkSyntax(String[] expr) 
    { 
     int k = 0; 
     for(int i = 0; i < expr.length; ++i) 
     { 
      if(!(isOperator(expr[i]))) 
      { 
       try 
       { 
       Double.parseDouble(expr[i]); 
       } 
       catch (Exception e) 
       { 
       for(int j = 0; j < i; ++j) 
       { 
        k += expr[j].length() + 1; 
       } 
       writeExpr(expr); 
       for(int l = 0; l < k; ++l) 
       { 
       System.out.print(" "); 
       } 
       System.out.println("^"); 
       System.out.println("Not a number or valid operator"); 
       return false; 
       } 
      } 

     } 
    return true; 
    } 

} // end Postfix2 


class StringStack 
{ 
    int top; 
    String[] pancake; 

    StringStack() //constructor for a new empty stack 
    { 
    top = 0; 
    pancake = new String[1000]; 

    } // end DoubleStack 

    boolean empty() //whether the stack is empty 
    { 
     return top == 0; 

    } // end empty 

    String pop() //remove and return the top element; throw an error if empty 
    { 
     if(empty()) 
     { 
      throw new Error("Error"); 
     } 
     top -= 1; 
     return pancake[top]; 

    } // end pop 

    void push(String x) //add x to the top of the stack 
    { 
     if(top < 1000) 
     { 
     pancake[top] = x; 
     top += 1; 
     } 
     else{ 
     throw new Error("Error"); 
     } 
    } // end push 

} // end StringStack 
+2

Пожалуйста, не отправляйте 200 строк кода, если для воспроизведения проблемы требуется только несколько. Что вы не понимаете из сообщения об ошибке? Как вы думаете, использование '*' и '-' будет означать при применении к значениям String? –

+1

Прочтите эту ошибку, она дает всю необходимую подсказку. Строка, код и почему. У вас действительно нет проблем. Подумайте больше, прежде чем просить о решениях для вашей конкретной проблемы. Избегайте попадания вниз. – cassioscabral

ответ

0

Изменить вам код, как это.

   if(input[i].equals("+")) 
       { 
        s.push(o1 + "+" + o2); 
       } 
       else if(input[i].equals("-")) 
       { 
        s.push(o2 + "-" + o1); 
       } 
       else 
       { 
        s.push(o1 + "*" + o2); 
       } 

Но для «1 2 3 + *» результат «3 + 2 * 1». Это еще одна проблема.

+0

Я получаю ошибки, говоря, что это не утверждение, ';' ожидается, или ')' ожидается – anderkat97

+0

@ anderkat97 Вы получаете ошибки, говорящие * что * не является утверждением? Вы действительно ожидаете, что сможете самостоятельно сортировать тривиальные ошибки компиляции, как это для себя, не спеша здесь или в другом месте. – EJP