中缀到postifx转换器

时间:2015-11-17 00:12:11

标签: java postfix-notation infix-notation

大家好我在这里有一个中缀到postfix转换器。 正在转换

4 - 9 * 11 + 155 * ( 21 - 17 )/ 3

4 9 11 155 21 17 3 - * + * - 

所以非常接近。这是正确的 表达更短。有什么想法吗?

public class ExpressionTools {
    static MyStack<String> operatorStack=new MyStack<String>();
    public static String infixToPostfix(String infix)throws Exception{
     Scanner tokenizer = new Scanner (infix);
        System.out.println("hi");
        String postFixExpression="";
        while (tokenizer.hasNext()){

            String temp=tokenizer.next();
            if(temp.charAt(0)>=48&&temp.charAt(0)<=57){
                for(int i=0; i<temp.length(); i++){
                    if(!Character.isDigit(temp.charAt(i))){
                        throw new PostFixException("Invalid expression"+temp);
                }
                }
                postFixExpression+=temp+" ";
            }

            else if(temp.equals('(')){
                operatorStack.push(temp);
            }
            else if(temp.equals("*")||temp.equals("+")||temp.equals("-")||temp.equals("/")){
                if(!operatorStack.isEmpty()){
                    while(operatorStack.isEmpty()&&operatorStack.peek().equals("*")||operatorStack.isEmpty()&&operatorStack.peek().equals("/")){
                        postFixExpression+=operatorStack.pop()+" ";

                    }
                }
                operatorStack.push(temp);
            }
            else if(temp.equals(")")){
                while(!operatorStack.isEmpty()){
                    if(!operatorStack.peek().equals("(")){
                        postFixExpression+=operatorStack.pop()+" ";
                    }
                    else{
                        operatorStack.pop();
                        break;
                    }

                }
            }
            System.out.println(postFixExpression);
        }


            while(!operatorStack.isEmpty()){
                postFixExpression+=operatorStack.pop()+" ";
            }



    System.out.println("final postfix");
    System.out.println(postFixExpression);
    return postFixExpression;
}

1 个答案:

答案 0 :(得分:0)

这里有几个问题。

  1. operatorStack.isEmpty()&&operatorStack.peek().equals("*")永远不会成真。

  2. operatorStack.isEmpty()&&operatorStack.peek().equals("/")永远不会成真。

  3. else if(temp.equals('(')){应为else if(temp.equals("(")){

  4. 您的标记生成器不会将)/分开。您需要在)之后添加空格,或者使用更好的标记器。