2016-03-10 1 views
1

J'essaie d'écrire une méthode qui convertit l'expression mathématique Infix en préfixe et pour cela j'utilise une pile. Mais je reçois des erreurs dans certains cas et je ne sais pas quel est le problème.Infixe pour préfixer le convertisseur d'expression mathématique en Java

code:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.Stack; 
import java.util.StringTokenizer; 

public class Prefixer { 

    public static void main(String[] args) { 
     String fileName; 
     boolean reduce = false; 
     if (args.length == 1){ 
      fileName = args[0]; 
     } 
     else if (args.length >= 2){ 
      reduce = args[0].equals("-r"); 
      fileName = args[1]; 
     } 
     else 
     { 
      return; 
     } 
     BufferedReader reader; 
     String line = ""; 
     try { 
      reader = new BufferedReader(new FileReader (fileName)); 
      line = reader.readLine(); 
      line = line.trim(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println(infixToPrefixConvert(line,reduce)); 
    } 

    public static boolean isOperand(String s) { 
     return !(s.equals("+") || s.equals("-") || s.equals("/") || s.equals("*") || s.equals("(") || s.equals(")")); 
    } 

    public static boolean isNumber(String s){ 
     try { 
      Integer.parseInt(s.trim()); 
     } catch (Exception e){ 
      return false; 
     } 
     return true; 
    } 

    public static String operationCombine(Stack<String> operatorStack, Stack<String> operandStack, boolean reduce){ 
     String operator = operatorStack.pop(); 
     String rightOperand = operandStack.pop(); 
     String leftOperand = operandStack.pop(); 
     if (reduce && isNumber(rightOperand) && isNumber(leftOperand)){ 
      int left = Integer.parseInt(leftOperand); 
      int right = Integer.parseInt(rightOperand); 
      int result = 0; 
      if (operator.equals("+")){ 
       result = left + right; 
      }else if (operator.equals("-")){ 
       result = left - right; 
      }else if (operator.equals("*")){ 
       result = left * right; 
      }else if (operator.equals("/")){ 
       result = left/right; 
      } 
      return "" + result; 

     } 
     String operand = "(" + operator + " " + leftOperand + " "+ rightOperand + ")"; 
     return operand; 
    } 

    public static int rank(String s) { 
     if (s.equals("+") || s.equals("-")) 
      return 1; 
     else if (s.equals("/") || s.equals("*")) 
      return 2; 
     else 
      return 0; 
    } 

    public static String infixToPrefixConvert(String infix, boolean reduce) { 
     Stack<String> operandStack = new Stack<String>(); 
     Stack<String> operatorStack = new Stack<String>(); 

     StringTokenizer tokenizer = new StringTokenizer(infix); 
     while (tokenizer.hasMoreTokens()) { 
      String token = tokenizer.nextToken(); 
      if (isOperand(token)) { 
       operandStack.push(token); 
      } 

      else if (token.equals("(") || operatorStack.isEmpty() 
        || rank(token) > rank(operatorStack.peek())) { 
       operatorStack.push(token); 
      } 

      else if (token.equals(")")) { 
       while (!operatorStack.peek().equals("(")) { 
        operandStack.push(operationCombine(operatorStack, operandStack,reduce)); 
       } 
       operatorStack.pop(); 
      } 

      else if(rank(token) <= rank(operatorStack.peek())){ 
       while(!operatorStack.isEmpty() && rank(token) <= rank(operatorStack.peek())){ 
        operandStack.push(operationCombine(operatorStack, operandStack,reduce)); 
       } 
       operatorStack.push(token); 
      } 
     } 
     while(!operatorStack.isEmpty()) { 
      operandStack.push(operationCombine(operatorStack, operandStack,reduce)); 
     } 
     return (operandStack.peek()); 
    } 

} 

Le fichier doit être la première ligne avec l'expression infixe que vous voulez convertir. L'indicateur -r est utilisé si vous souhaitez réduire des expressions arithmétiques simples lorsque vous convertissez en préfixe. par exemple dans test.txt, si je

3 * 9 + (9 + y)/4 - x 

Il fonctionne très bien. mais si je

12/c + c * p^(8 + 9) 

il devrait me donner: 12 c/cp 8 9 +^* + mais je reçois: (+ p (*^(+ 8 9)))

quel est le problème. Aidez-moi, s'il vous plaît. merci vous

Répondre

0

Juste prendre un aperçu de votre code, je pourrais probablement dire que cette ligne

String operand = "(" + operator + " " + leftOperand + " "+ rightOperand + ")"; 

est la racine de votre problème, et le fait que vous n'êtes pas opérateur envisagez ^ en fonction operationCombine.

+0

Merci, ça marche – Reza