0
  static String convert(String exp)
  {
    String result="";
    Stack s1=new Stack();
     for(int i=0;i<exp.length();i++)
      {
       if(Character.isDigit(exp.charAt(i)))
       {{
       result=result+exp.charAt(i);
       continue;
       }
       else
       {
        if(s1.empty())
        {
         s1.push(exp.charAt(i));
          continue;
        }
        else
        {
         if(check(exp.charAt(i))>check(exp.charAt(i-1)))
         s1.push(exp.charAt(i));
         else
        {
        while(!s1.empty())
        {
        String a=s1.pop().toString();
        result=result+a;
        }
        s1.push(exp.charAt(i));
        }
       }
      }
     }
    while(!s1.empty())
    {
    String p=s1.pop().toString();
    result=result+p;
    }
    return result;
  }

    static int check(char c)
    {
    switch (c) {
            case '+':
            case '-':
                return 0;
            case '*':
            case '/':
                return 1;
            case '^':
                return 2;
            default:
                throw new IllegalArgumentException("Operator unknown: " + c);
            }
    }

这是我将表达式从中缀转换为后缀的代码。此代码仅使用 2 个操作数就可以正常工作。对于超过 2 个操作数(如 6+9*7),它显示 IllegalArgumentException,我在另一种方法中给出了设置运算符优先级的方法。请帮我澄清我哪里错了?

4

2 回答 2

0

由于您的逻辑,您会遇到此异常。考虑 1+2*3。在这种情况下,当你得到 3 时,下面的代码就会被执行:

else
{
if(check(exp.charAt(i))>check(exp.charAt(i-1)))
s1.push(exp.charAt(i));

并且检查(3)导致

default:
            throw new IllegalArgumentException("Operator unknown: " + c);
于 2013-07-03T11:44:35.857 回答
0
  1. 缩进你的代码
  2. 在堆栈跟踪中:

    at Test.convert(Test.java:21)
    

    这条线是:

    if(check(exp.charAt(i))>check(exp.charAt(i-1)))
    

    所以我认为你的意思是:

    if (check(exp.charAt(i)) > check(s1.peek()))
    
  3. 现在“Test 类型中的方法 check(char) 不适用于参数 (Object)”被提出,所以参数化你的Stack. 也就是说,改变:

    Stack s1=new Stack();
    

    到(在 Java 7 中):

    Stack<Character> s1 = new Stack<>();
    
于 2013-07-03T11:40:30.510 回答