1

第一次发帖,请告诉我如何改进。

我正在开发一个将中缀表示法转换为后缀然后进行评估的程序。我对后缀的转换进展顺利,但我的评估遇到了一些问题。在下面的代码中,当我尝试将操作数转换为双变量“数字”时,它们不会保持它们的值(参见下面的运行时输出)。这是有问题的方法的一部分(打印语句仅用于调试)。

public boolean evaluatePostfix(StringBuffer postfix)
    {
        Stack <Double> operand = new Stack <Double>();//stack to hold operand values
        double answer = 0; //variable to hold result of expression
        boolean error = false; //tests for input error
        int pos = 0; //temp veraible stores position in postfix expression
        double number = 0; //temp variable to convert char to double. also stores that value for reference
        double val1 = 0; //first value for operations
        double val2 = 0; //second value for operations
        double val3 = 0; //answer for val1 and val2

        while (!error && pos < postfix.length())
                {
                    System.out.println(postfix.charAt(pos));
                    if (postfix.charAt(pos) == ' ')
                        ; //do nothing
                    else if (Character.isDigit(postfix.charAt(pos)))
                    {
                        number = Double.parseDouble(postfix.substring(pos));
                        System.out.printf ("number = %f", number);
                        operand.push(number);
                    }
                    else
                    {
                        val1 = operand.pop();
                        val2 = operand.pop();
                        System.out.printf ("val1: %f\tval2: %f\n", val1, val2);

---在运行时--- 1

数字 = 49.000000

8

数字 = 56.000000

+

val1:56.000000

val2:49.000000

val3 = 105.000000

105.0

4

3 回答 3

1

您正在获取每个字符的 ASCII 值,例如 '1' =>49并将其推入堆栈。

您最可能想要的是使用扫描仪读取从您输入的文本转换而来的数字。

于 2012-11-12T17:02:33.587 回答
0

代替:

number = postfix.charAt(pos);

和:

number = Double.parseDouble(Character.toString(postfix.charAt(pos)));

Double.parseDouble方法将字符串转换为双精度:

返回一个新的 double,初始化为由指定 String 表示的值,由 Double 类的 valueOf 方法执行。

(来自 Javadoc)


如果您使用 postfix.toString.split(" ") 拆分字符串,然后在 string[] 上迭代,您将能够解析双精度值(如“8.4567”):

    String[] sa = postfix.toString().split(" ");        
    for (String string : sa) {
    .... omissis ...    

否则,您的代码仅解析单个数字整数值才是正确的。

于 2012-11-12T17:30:19.523 回答
0

解析表达式可能不是一项简单的任务。在更复杂的情况下,使用解析器生成器是唯一合理的方法。

在你的情况下,你可能没有一个:

  • 你的“代币”是什么?
  • 你如何检测每个令牌的开始和结束?
  • 从输入中提取令牌后,您将如何处理每个令牌?

您的标记似乎是(十进制)数字和算术运算符。- 你如何确定每个的开始和结束?它们之间的空格“”可以构成足够的分隔符。

然后您可以一次干净地解析一个令牌:Double.parseDouble(...)用于解析数字令牌并相应地处理运算符。

您可能想查看 Java 的Tokenizer以支持从输入中提取标记。

于 2012-11-12T18:20:07.050 回答