0

我正在尝试评估后缀表达式。

我的代码可以编译,但最终的答案是错误的。

我尝试查看其他答案,但它们不在 Java 中。

public class PA36Stack
{
   public static void main(String[] args)
   {
      PA31Stack an = new PA31Stack(12);

      String g = "234*+";
      int x = evaluate(an, g);
      System.out.print(x);
   }

   public static int evaluate(PA31Stack b, String g)
   {
      int temp = 0;
      for (int i = 0; i < g.length(); i++)
      {
         if (g.charAt(i) != '+' && g.charAt(i) != '-' && g.charAt(i) != '*' && g.charAt(i) != '/')
         {
            b.push(g.charAt(i));
         }
         else
         {
            int a = b.pop();
            int c = b.pop();

            if (g.charAt(i) == '+')
            {
               temp = a + c;
               b.push(temp);
            }
            //nextone
            if (g.charAt(i) == '-')
            {
               temp = (c - a);
               b.push(temp);
            }
            //two
            if (g.charAt(i) == '*')
            {
               temp = (c * a);
               b.push(temp);
            }
            //three
            if (g.charAt(i) == '/')
            {
               temp = (c / a);
               b.push(temp);
            }
         }
      }
      return b.pop();
   }
}
4

1 回答 1

1

这是因为您正在使用代表数字的字符的 ASCII 值进行计算。

基本上,您需要将表示数字的 char 转换为它实际表示的 int,即 make of '1'a1和 of '2'a 2an 等等。

为了解决这个问题,您需要在'0'从堆栈中弹出时减去 char 的 ascii 值以获得真正的整数值并在推送时添加它。

由于您尚未发布堆栈代码,因此我已对其进行了编辑以使用 ajava.util.Stack<Character>并获得了14表达式的正确结果234*+

public static int evaluate(Stack<Character> b, String g) {
    int temp = 0;
    for (int i = 0; i < g.length(); i++) {
        if (g.charAt(i) != '+' && g.charAt(i) != '-' && g.charAt(i) != '*'
                && g.charAt(i) != '/') {
            b.push(g.charAt(i));
        } else {
            int a = b.pop() - '0';
            int c = b.pop() - '0';

            if (g.charAt(i) == '+') {
                temp = a + c;
                b.push((char)(temp + '0'));
            }
            // nextone
            if (g.charAt(i) == '-') {
                temp = (c - a);
                b.push((char)(temp + '0'));
            }
            // two
            if (g.charAt(i) == '*') {
                temp = (c * a);
                b.push((char)(temp + '0'));
            }
            // three
            if (g.charAt(i) == '/') {
                temp = (c / a);
                b.push((char)(temp + '0'));
            }
        }
    }
    return b.pop() - '0';
}
于 2013-11-12T15:55:31.853 回答