C++ 从C+中的字符串计算算术表达式+;

C++ 从C+中的字符串计算算术表达式+;,c++,C++,我正在寻找一种从字符串计算简单数学表达式的简单方法,如下所示: 3*2+4*1+(4+9)*6 我只想要+和*操作加(和)符号。而且*比+优先级更高,我认为您正在寻找一个简单的解决方案 下面是一个非常简单的示例: const char * expressionToParse = "3*2+4*1+(4+9)*6"; char peek() { return *expressionToParse; } char get() { return *expressionToParse

我正在寻找一种从字符串计算简单数学表达式的简单方法,如下所示:

3*2+4*1+(4+9)*6


我只想要
+
*
操作加
符号。而且
*
+

优先级更高,我认为您正在寻找一个简单的解决方案

下面是一个非常简单的示例:

const char * expressionToParse = "3*2+4*1+(4+9)*6";

char peek()
{
    return *expressionToParse;
}

char get()
{
    return *expressionToParse++;
}

int expression();

int number()
{
    int result = get() - '0';
    while (peek() >= '0' && peek() <= '9')
    {
        result = 10*result + get() - '0';
    }
    return result;
}

int factor()
{
    if (peek() >= '0' && peek() <= '9')
        return number();
    else if (peek() == '(')
    {
        get(); // '('
        int result = expression();
        get(); // ')'
        return result;
    }
    else if (peek() == '-')
    {
        get();
        return -factor();
    }
    return 0; // error
}

int term()
{
    int result = factor();
    while (peek() == '*' || peek() == '/')
        if (get() == '*')
            result *= factor();
        else
            result /= factor();
    return result;
}

int expression()
{
    int result = term();
    while (peek() == '+' || peek() == '-')
        if (get() == '+')
            result += term();
        else
            result -= term();
    return result;
}

int _tmain(int argc, _TCHAR* argv[])
{

    int result = expression();

    return 0;
}
const char*expressionToParse=“3*2+4*1+(4+9)*6”;
char peek()
{
return*expressionToParse;
}
char get()
{
return*expressionToParse++;
}
int表达式();
整数()
{
int result=get()-“0”;

虽然(peek()>='0'&&peek()='0'&&peek()我已经用C#编写了一个非常简单的表达式求值器(使其符合C++所需的最小更改)。它基于表达式树构建方法,只是树没有实际构建,而是所有节点都在适当的位置进行求值


您可以在以下地址找到它:

在搜索库以查找我找到的类似任务时。这似乎是一件正确的事情。不幸的是,GPL对我来说是不可接受的。

可以尝试:

  • 很简单
  • 只需要在源代码中包含“exprtk.hpp”
  • 可以动态更改表达式变量的值
  • 良好的起点:

  • 只是添加另一个替代方案,考虑尝试这个问题。它是开源的,在一个源代码文件中是自包含的。它实际上是用C编写的,但是它将按照我的经验将C++编译干净。

    从上面求解示例表达式非常简单:

    #include "tinyexpr.h"
    #include <stdio.h>
    
    int main()
    {
        double answer = te_interp("3*2+4*1+(4+9)*6", 0);
        printf("Answer is %f\n", answer);
        return 0;
    }
    
    #包括“tinyexpr.h”
    #包括
    int main()
    {
    双答案=TEU interp(“3*2+4*1+(4+9)*6”,0);
    printf(“答案是%f\n”,答案);
    返回0;
    }
    
    所以我在寻找这个问题的答案。我试图创建自己的编程语言。对于数学表达式,我需要这个函数

    好的,我会给你的。你想怎么用就怎么用

    /* Code here before is useless now */
    
    这是一种很长而且可能是一种无效的方法来完成这样的任务。但是它完成了任务,所以去做吧。很快我计划添加变量支持。但是你也可以这样做,这很容易(我想:p)

    编辑:我刚刚整理了功能,现在它的工作原理像魔术XD

    using namespace std;
    
    double eval(string expr)
    {
        string xxx; // Get Rid of Spaces
        for (int i = 0; i < expr.length(); i++)
        {
            if (expr[i] != ' ')
            {
                xxx += expr[i];
            }
        }
    
        string tok = ""; // Do parantheses first
        for (int i = 0; i < xxx.length(); i++)
        {
            if (xxx[i] == '(')
            {
                int iter = 1;
                string token;
                i++;
                while (true)
                {
                    if (xxx[i] == '(')
                    {
                        iter++;
                    } else if (xxx[i] == ')')
                    {
                        iter--;
                        if (iter == 0)
                        {
                            i++;
                            break;
                        }
                    }
                    token += xxx[i];
                    i++;
                }
                //cout << "(" << token << ")" << " == " << to_string(eval(token)) <<  endl;
                tok += to_string(eval(token));
            }
            tok += xxx[i];
        }
    
        for (int i = 0; i < tok.length(); i++)
        {
            if (tok[i] == '+')
            {
                //cout << tok.substr(0, i) + " + " +  tok.substr(i+1, tok.length()-i-1) << " == " << eval(tok.substr(0, i)) + eval(tok.substr(i+1, tok.length()-i-1)) << endl;
                return eval(tok.substr(0, i)) + eval(tok.substr(i+1, tok.length()-i-1));
            } else if (tok[i] == '-')
            {
                //cout << tok.substr(0, i) + " - " +  tok.substr(i+1, tok.length()-i-1) << " == " << eval(tok.substr(0, i)) - eval(tok.substr(i+1, tok.length()-i-1)) << endl;
                return eval(tok.substr(0, i)) - eval(tok.substr(i+1, tok.length()-i-1));
            }
        }
    
        for (int i = 0; i < tok.length(); i++)
        {
            if (tok[i] == '*')
            {
                //cout << tok.substr(0, i) + " * " +  tok.substr(i+1, tok.length()-i-1) << " == " << eval(tok.substr(0, i)) * eval(tok.substr(i+1, tok.length()-i-1)) << endl;
                return eval(tok.substr(0, i)) * eval(tok.substr(i+1, tok.length()-i-1));
            } else if (tok[i] == '/')
            {
                //cout << tok.substr(0, i) + " / " +  tok.substr(i+1, tok.length()-i-1) << " == " << eval(tok.substr(0, i)) / eval(tok.substr(i+1, tok.length()-i-1)) << endl;
                return eval(tok.substr(0, i)) / eval(tok.substr(i+1, tok.length()-i-1));
            }
        }
    
        //cout << stod(tok.c_str()) << endl;
        return stod(tok.c_str()); // Return the value...
    }
    
    使用名称空间std;
    双值(字符串表达式)
    {
    字符串xxx;//去掉空格
    对于(int i=0;i//无法将中缀表达式转换为后缀表达式。然后计算

    后缀可能看起来像
    32*41*+49+6*+


    使用堆栈来评估这一点非常容易。

    我认为递归体面不适用于算术,因为它完全是左递归的。这一点的可能重复应该是公认的答案!
    exprtk
    功能强大且简单,值得先试用!在我从链接下载的所有文件中,哪一个是最简单的o是否包含在qt项目中使用库?@mLstudent33:“只需要在源代码中包含“exprtk.hpp”。此代码不能很好地处理负数。这会破坏操作顺序和功能。我通过添加一个简单规则来修复此
    else if(tok[I]='-'){if(tok.substr(0,I).length()!=0&&tok[i-1]!='*'&&tok[i-1]!='/')返回eval(tok.substr(0,i))+eval(“-”+tok.substr(i+1,tok.length()-i-1));}
    并在传递-to其余求值时将-to改为+,这样操作顺序就不会中断。