当前位置: 首页 > 知识库问答 >
问题:

如何解析带有负数和减号的算术字符串表达式?

壤驷承
2023-03-14

我正在尝试解析一个带有负数和负号的字符串,并将每个标记添加到一个名为infix的队列中,并添加一个函数来判断标记是否是运算符。但是,负数被视为负号,并被添加到与负数分开的队列中。这是我的代码,用于将字符串分解为数字并将它们添加到队列中。

for(int i = 0;i < expression.length();i++) // add all items from the expression to the infix queue
        {
            String value = String.valueOf(expression.charAt(i));

            if(eval.isOperator(value) == true)
            {
                infix.add(value);
            }
            else
            {
                for(int j = i+1; eval.isOperator(String.valueOf(expression.charAt(j))) == false; j++)//add token to value until an operator is found and that number ends
                {
                    value += expression.charAt(j);
                    i++;
                }

                    infix.add(value);

            }
        }

还有eval类

public class Eval 
{
    public boolean isOperator(String n)
    {
        switch(n)
        {
        case "(":
            return true;
        case ")":
            return true;
        case "*":
            return true;
        case "/":
            return true;
        case "+":
            return true;
        case "-":
            return true;
        case "#":
            return true;
        }

        return false;
    }

    public int Priority(String op)
    {
        switch(op)
        {
        case "(":
            return 3;
        case "*":
            return 2;
        case "/":
            return 2;
        case "+":
            return 1;
        case "-":
            return 1;

        }
        return 0;
    }

}

    }

共有2个答案

慕俊语
2023-03-14
    public class Eval 
{
     boolean binaryOp = false;
    public boolean isOperator(String n)
    {
        switch(n)
        {
        case "(":
            return true;
        case ")":
            return true;
        case "*":
            ;
        case "/":
            ;
        case "+":
            binaryOp = true;
            return true;
        case "-":
                    If (binaryOp) break;
        case "#":
            return true;
        }
        binaryOp = false;
        return false;
     }
     public int Priority(String op)
    {
        switch(op)
        {
        case "(":
            return 3;
        case "*":
            return 2;
        case "/":
            return 2;
        case "+":
            return 1;
        case "-":
            return 1;

        }
        return 0;
    }

}
蒋正平
2023-03-14

大多数语言处理此问题的方法是稍后执行。正如@Sweeper所说,-将是一个操作符,稍后的代码将选择这是二进制操作符还是一元操作符。假设您计划在某个时候评估这些表达式,那么这样做最终真的不会有太多额外的工作。

但是,为了按照您的方式处理它,我首先提取一些函数,可能是<code>eval。lexNumber(字符串表达式,整数索引)

for(int j = i+1; eval.isOperator(String.valueOf(expression.charAt(j))) == false; j++)

然后,这只是一个显式检查的问题:

if (value == "-" && isNumber(expression.charAt(j+1))
{
    // I assume you have access to some sort of isNumber function
    // and that you can check for an out of bounds access on your own 
    infix.add("-" + lexNumber(expression, j+1));
}
else if(eval.isOperator(value) == true)
{
     infix.add(value);
}
else
{ 
    // etc
}

这是一个粗略的、未经测试的朝着正确方向的推动,忽略了小问题。特别是更新循环索引的问题。我建议使用一些新类来封装表达式源以及当前位置。类似于:

while (tokenStream.hasNext())
{
    infix.add(tokenStream.next());
}
 类似资料:
  • 问题内容: 我有一个字符串,我正在尝试将其解析为一个数字。我尝试使用,结果为2。我猜逗号是问题所在,但我将如何以正确的方式解决此问题?只需删除逗号? 问题答案: 是的,删除逗号:

  • 我是cucumber自动化测试的新手,我有一个maven项目,我试图传递一个字符串,但我有这个错误。

  • 这是我的代码后运行这段代码,我得到异常: 以下给出了堆栈跟踪的异常: 请帮我解决这个问题。

  • 我在解析antlr4中的格式行列表时遇到了一个问题 但这是失败的第一个字符识别'*'本身,这使我困惑。 第1行:0不匹配的输入'*这是一个字符串',应为'*'

  • 我对正则表达式很陌生。我需要构造一个正则表达式,如果在下面的代码中使用,它将生成一个只有字母(大小写)、数字、、、和。 以下表达式不起作用:。它替换了一些字母,而不是所有不需要的字符。为什么它不起作用?

  • 2.密码必须至少包含一个大写字母、一个小写字母、一个数字和一个标点符号。(例如a-z,a-z,0-9,!@#$%^&*()_+~-=`{}[]:“;'<>?,./) 我尝试使用:{}:“;'<>?,./-][])$` 但是,当我在中测试时,标点符号部分的解释并不清楚 标点符号的解释好像坏了,可以解释一下原因并帮我完成这个。