2013-04-10 82 views
1

时认识负值这是我的课:转换缀以后缀

import java.io.*; 
import java.util.*; 
import java.lang.*; 
import java.util.Scanner; 
import java.util.List; 
import java.util.Stack; 

/** 
* 
* @author rtibbetts268 
*/ 
public class InfixToPostfix 
{ 
     /** 
     * Operators in reverse order of precedence. 
     */ 
    private static final String operators = "_-+/*"; 
    private static final String operands = "x"; 

    public String xToValue(String postfixExpr, String x) 
    { 
     char[] chars = postfixExpr.toCharArray(); 
     StringBuilder newPostfixExpr = new StringBuilder(); 

     for (char c : chars) 
     { 
      if (c == 'x') 
      { 
       newPostfixExpr.append(x); 
      } 
      else 
      { 
       newPostfixExpr.append(c); 
      } 
     } 
     return newPostfixExpr.toString(); 
    } 

    public String convert2Postfix(String infixExpr) 
    { 
     char[] chars = infixExpr.toCharArray(); 
     StringBuilder in = new StringBuilder(infixExpr.length()); 

     for (int i : chars) 
     { 
      if (infixExpr.charAt(i) == '-') 
      { 
       if (isOperand(infixExpr.charAt(i+1))) 
       { 
        if (i != infixExpr.length()) 
        { 
         if (isOperator(infixExpr.charAt(i-1))) 
          in.append('_'); 
        } 
        else 
        { 
         in.append(infixExpr.charAt(i)); 
        } 
       } 
       else 
       { 
        in.append(infixExpr.charAt(i)); 
       } 
      } 
      else 
      { 
       in.append(infixExpr.charAt(i)); 
      } 
     } 

     chars = in.toString().toCharArray(); 
     Stack<Character> stack = new Stack<Character>(); 
     StringBuilder out = new StringBuilder(in.toString().length()); 

     for (char c : chars) 
     { 
      if (isOperator(c)) 
      { 
       while (!stack.isEmpty() && stack.peek() != '(') 
       { 
        if (operatorGreaterOrEqual(stack.peek(), c)) 
        { 
         out.append(stack.pop()); 
        } 
        else 
        { 
         break; 
        } 
       } 
       stack.push(c); 
      } 
      else if (c == '(') 
      { 
       stack.push(c); 
      } 
      else if (c == ')') 
      { 
       while (!stack.isEmpty() && stack.peek() != '(') 
       { 
        out.append(stack.pop()); 
       } 
       if (!stack.isEmpty()) 
       { 
        stack.pop(); 
       } 
      } 
      else if (isOperand(c)) 
      { 
       out.append(c); 
      } 
     } 
     while (!stack.empty()) 
     { 
      out.append(stack.pop()); 
     } 
     return out.toString(); 
    } 

    public int evaluatePostfix(String postfixExpr) 
    { 
     char[] chars = postfixExpr.toCharArray(); 
     Stack<Integer> stack = new Stack<Integer>(); 
     for (char c : chars) 
     { 
      if (isOperand(c)) 
      { 
       stack.push(c - '0'); // convert char to int val 
      } 
      else if (isOperator(c)) 
      { 
       int op1 = stack.pop(); 
       int op2 = stack.pop(); 
       int result; 
       switch (c) { 
        case '*': 
         result = op1 * op2; 
         stack.push(result); 
         break; 
        case '/': 
         result = op2/op1; 
         stack.push(result); 
         break; 
        case '+': 
         result = op1 + op2; 
         stack.push(result); 
         break; 
        case '-': 
         result = op2 - op1; 
         stack.push(result); 
         break; 
       } 
      } 
     } 
     return stack.pop(); 
    } 

    private int getPrecedence(char operator) 
    { 
     int ret = 0; 
     if (operator == '_') 
     { 
      ret = 0; 
     } 
     if (operator == '-' || operator == '+') 
     { 
      ret = 1; 
     } 
     else if (operator == '*' || operator == '/') 
     { 
      ret = 2; 
     } 
     return ret; 
    } 

    private boolean operatorGreaterOrEqual(char op1, char op2) 
    { 
     return getPrecedence(op1) >= getPrecedence(op2); 
    } 

    private boolean isOperator(char val) 
    { 
     return operators.indexOf(val) >= 0; 
    } 

    private boolean isOperand(char val) 
    { 
     return operands.indexOf(val) >= 0; 
    } 

} 

在这里面我改变缀表达式到后缀表达式与方法convert2Postfix()

有一小部分是在最开始我在哪里重写与具有'_'盈他们的所有负数,而不是一个"-"的字符串输入。它不起作用。

例如:改变-4 _4

什么我需要做的,使这项工作?

+1

请隔离您的问题分成小编译代码。发布这个简化的代码,得到结果,结果你相信你应该得到。 – 2013-04-10 07:19:30

+0

@PM 77-1这里所有的代码工作团结一致。如果没有向您显示所有代码,我无法向您显示相关方法。 – 2013-04-10 23:33:37

回答

2

你有一些错误的这里,这里是第一个:

for (int i : chars) 

字符转换为相应的int值。例如,如果字符包含一个单字符 'A':

char [] chars = new char[1]; 
    chars[0] = 'A'; 
    for(int i: chars){ 
     System.out.println(i); //You will have a '65' here 
    } 

你真正的意思可能是:

for (int i=0;i<chars.length;++i) 

这也是错误的:

if (isOperator(infixExpr.charAt(i-1))) 

它应该是:

if (isOperator(infixExpr.charAt(i))) 

然后有一个proble m的方式来放置和移除堆栈中的元素。 毕竟这改变了你也应该这样做:

return out.reverse().toString(); 

代替:

return out.toString(); 

这里是我结束了:http://pastebin.com/2TLqPUsH (改弦易辙的类的名称)

+0

谢谢您的输入。你有效地回答了我的问题,我会为此投票。然而,你所拥有的一切都不能正确地与我的代码一起工作,我想指出这一点。我正在做一个后缀表达式,而不是前缀之一。此外,如果您更深入地阅读我的代码,您会注意到我有另一种计算和计算数学的方法。我还没有设置它来处理消极处理,但是对于所有正整数,它将执行后缀方程的飞蛾,因为我必须反转任何东西或不反转。 – 2013-04-10 23:31:45