将中缀转换为后缀并在Java中计算表达式

时间:2012-02-28 00:10:01

标签: java

我应该编写程序,使用Java中的堆栈将中缀表示法转换为后缀表示法。我已经完成了很多,但是收到了错误。这是现在的代码:

import java.util.Scanner;
import java.util.Stack;

public class InfixToPostfix {
  private String infix;
  private String postfix = "";

  public void convertString (String a){
    String str = "";
    infix = a;
    Stack<String> stack = new Stack<String>();

    for (int i = 0; i < infix.length(); i++){
      str = infix.substring(i,i+1);
      if(str.matches("[a-zA-Z]|\\d"))
        postfix += str;
      else if (isOperator(str)){
        if (stack.isEmpty()){
          stack.push(str);
        }
        else{
          String stackTop = stack.peek();
          while (getPrecedence(stackTop,str).equals(stackTop)
                 && !(stack.isEmpty())){
            postfix += stack.pop();
            if (!(stack.isEmpty()))
              stackTop = stack.peek();
          }
          stack.push(str);
        }
      }
    }
    while(!(stack.isEmpty()))
      postfix += stack.pop();
    System.out.println("The postfix form of the expression you entered is: " +
                       postfix);
  }

  private boolean isOperator(String ch){
    String operators = "*/%+-";
    if (operators.indexOf(ch) != -1)
      return true;
    else
      return false;
  }

  private String getPrecedence(String op1, String op2){
    String multiplicativeOps = "*/%";
    String additiveOps = "+-";
    if ((multiplicativeOps.indexOf(op1) != -1) && (additiveOps.indexOf(op2) != -1))
      return op1;
    else if ((multiplicativeOps.indexOf(op2) != -1) && (additiveOps.indexOf(op1) != 
                                                        -1))
      return op2;
    else if((multiplicativeOps.indexOf(op1) != -1) && (multiplicativeOps.indexOf   
                                                       (op2) != -1))
      return op1;
    else
      return op1;
  }
  public static void main(String[] args) {

    System.out.println("Enter an expression in the Infix form:");
    Scanner scanner = new Scanner(System.in);

    String expression = scanner.nextLine();
    new convertString (expression);

  } 
}

错误发生在最后一行并说:

“线程中的异常”主“java.lang.Error:未解决的编译问题:     convertString无法解析为类型

at InfixToPostfix.main(InfixToPostfix.java:62)"

有关如何解决此问题的任何想法?我做错了什么?

编辑:我的代码正常工作,它成功地将中缀转换为后缀,但有没有什么方法可以让它来评估表达式并吐出答案?例如,如果输入为2 + 3,那么它会将其转换为23+,然后再吐出5。

4 个答案:

答案 0 :(得分:3)

你正在做new InfixToPostfix (expression),但这需要调用一个带有String参数的构造函数。但是你没有写过这样的构造函数。

答案 1 :(得分:2)

您没有提供接受字符串的构造函数。

根据您编写的代码,您应该做什么

new InfixToPostfix().convertString(expression);

答案 2 :(得分:2)

您正在尝试使用从未在类InfixToPostfix中设置的构造函数。您尝试使用的方法是convertString(String)方法。有两种方法可以解决这个问题...

您可以使用String参数创建构造函数,只需在构造函数中调用该方法:

public InfixToPostfix(String a) {
   convertString(a);
}

或者使用InfixToPostfix实例从main方法调用convertString函数:

InfixToPostfix ip = new InfixToPostfix();
ip.convertString(expression);

答案 3 :(得分:1)

您需要提供一个带String参数的构造函数。 看起来像:

public InfixToPostfix(String infix) {

this.infix = infix;

}