2017-03-27 127 views
0

我有此代碼將中綴表達式轉換爲後綴表達式之後,我想評估表達式並找到值,因此我所做的是要求用戶在例如。 A + B * C + D方式然後我使用一種方法轉換它,然後我要求用戶輸入A,B,C和D的值,以便我可以評估表達式,當用戶輸入值時,我將它們放置在字符串數組,並嘗試評估它,但我卡在這裏,並嘗試了很多方法來做評估,但沒有運氣!這裏是我的代碼:從中綴表達式轉換後評估postfix表達式

public class Main { 
    private Stack stack = new Stack(); 
    char symbol; 
    String postfix = ""; 
    String prefix; 

/////////////////////////////////////////////////////////////////////////////////////////////// 

    public char prefixLetterOrOprand(char ch) { 
     if (Character.isLetter(ch)) 
      prefix = ch + prefix; 
     else { 
      while (!isEmpty() && charValue(ch) <= charValue((char) stack.peek())) 
       prefix = stack.pop() + prefix; 
      stack.push(ch); 
     } 
     return ch; 
    } 

    /////////////////////////////////////////////////////////////////////////////////////////////// 

    public String toPostfix(String infix) { 
     for (int i = 0; i < infix.length(); ++i) { 
      symbol = infix.charAt(i); 
      isLetterOrOprand(symbol); 
     } 
     while (!isEmpty()) 
      postfix = postfix + stack.pop(); 
     return postfix; 
    } 

     /////////////////////////////////////////////////////////////////////////////////////////////// 

public int evaluate(String expression, int[] value) { 
    String a = convertExpressionToValues(expression, value); 
    int sum = 0; 
    Stack<Character> operand = new Stack<>(); 
    Stack<Character> operator = new Stack<>(); 

    for (int i = 0; i <= expression.length() - 1; i++) { 
     if (Character.isLetterOrDigit(expression.charAt(i)) == true) { 
      operand.push(a.charAt(i)); 
      System.out.println("Letters: " + operand.peek()); 
     } else { 
      if (operator.isEmpty()) { 
       operator.push(expression.charAt(i)); 
      } 
      if (!operator.isEmpty() && charValue(expression.charAt(i)) >= charValue(operator.peek())) { 
       operator.push(expression.charAt(i)); 
       sum = Integer.parseInt(a); 
      } 
      System.out.println("Digits: " + operator.peek()); 
     } 
    } 
    return sum; 
} 

private String convertExpressionToValues(String expression, int[] value) { 
    StringBuilder a = new StringBuilder(expression);   
    a.replace(a.indexOf("A"), a.indexOf("A") + 1, Integer.toString(value[0])); 
    a.replace(a.indexOf("B"), a.indexOf("B") + 1, Integer.toString(value[1])); 
    a.replace(a.indexOf("C"), a.indexOf("C") + 1, Integer.toString(value[2])); 
    a.replace(a.indexOf("D"), a.indexOf("D") + 1, Integer.toString(value[3])); 
    return a.toString(); 
} 

/////////////////////////////////////////////////////////////////////////////////////////////// 

    public char isLetterOrOprand(char ch) { 
     if (Character.isLetter(ch)) 
      postfix = postfix + ch; 
     else { 
      while (!isEmpty() && charValue(ch) <= charValue((char) stack.peek())) 
       postfix = postfix + stack.pop(); 
      stack.push(ch); 
     } 
     return ch; 
    } 

    /////////////////////////////////////////////////////////////////////////////////////////////// 

    public int charValue(char ch) { 
     if (ch == '+' || ch == '-') 
      return 1; 
     else if (ch == '*' || ch == '/') 
      return 2; 
     return 0; 
    } 

    public boolean isEmpty() { 
     return stack.size() == 0; 
    } 
    /////////////////////////////////////////////////////////////////////////////////////////////// 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Please Enter a value"); 
     String value = scan.next(); 
     Main main = new Main(); 
     System.out.println("Postfix Value: " + main.toPostfix(value)); 
     System.out.println("-----------------------------------"); 
     System.out.println("Prefix Value: " + main.toPrefix(value)); 

     System.out.println("Enter A Value For A: "); 
     int a = scan.nextInt(); 
     System.out.println("Enter A Value For B: "); 
     int b = scan.nextInt(); 
     System.out.println("Enter A Value For C: "); 
     int c = scan.nextInt(); 
     System.out.println("Enter A Value For D: "); 
     int d = scan.nextInt(); 
     int[] values = { a, b, c, d }; 
     main.evaluate(values); 
    } 

} 
+0

我建議你將值保存爲數字,而不是字符串,因爲你想用它們進行算術運算。你也應該使用'Map'而不是數組,以便你可以通過名字查找值。 –

+0

我試圖使堆棧達到我的目標,但我的charValue(char ch)方法不支持,所以如果有任何更好的建議請諮詢。 –

+0

'charValue()'方法的用途是什麼? –

回答

0

看看這段代碼:

public int evaluate(int[] value) { 
    String a = Arrays.toString(value); 
    System.out.println("PREFIDXSS:: " + toPostfix(a)); 
    return 0; 
} 

這裏value是由用戶中輸入的值的數組。當你將這個數組轉換爲一個字符串時,你會得到類似於"[1, 2, 3, 4]"的東西。請注意,這是而不是中綴表達式,所以發送此字符串到toPostfix()將不起作用,因爲該方法期望該字符串是適當的中綴表達式。

你有一些正確的想法。您需要執行類似於您當前的toPostfix()的操作。但是,您錯過了一條非常重要的信息:表達式評估

你這裏有兩種選擇:

  1. 當您從綴轉換爲後綴,您可以保存並稍後進行的評估中使用的表達一定的代表性。

  2. 您可以編寫toPostfix()函數,接受參數的修改形式:一個綴表達式和值的變量的數組。這種新方法的算法與您擁有的算法非常相似。主要區別在於您需要一個Stack<Integer>,以便您可以進行實際計算。當您在中綴操作中遇到操作符時,您還需要執行操作。最終結果將是一個數字而不是一個字符串。

+0

的最新版本我有一個字符串表示表達式是後綴字符串,在調用toPostfix方法後,後綴字符串具有表達式 –

+0

@KhaledJamal以使用後綴字符串,您將必須一次解析一個字符。 –