21xrx.com
2024-06-02 22:41:43 Sunday
登录
文章检索 我的文章 写文章
使用C++将字符串转换成表达式并执行
2023-07-10 08:33:36 深夜i     --     --
C++ 字符串 转换 表达式 执行

在C++中,我们可以通过将字符串转换为表达式来执行数学运算。这在编写计算器程序或处理数学问题时非常有用。下面是一些方法,可以实现将字符串转换为表达式并执行它们的方法。

1. 利用数学库函数:

C++中有几个标准库函数可以用来执行数学运算。这些函数包括sin、cos、tan、sqrt和pow。首先我们需要将字符串转换为浮点数,然后使用这些函数进行数学运算。以下是一个示例:


#include <iostream>

#include <cmath>

using namespace std;

int main()

{

  string expr = "2.0 * sqrt(16.0)";

  double result = eval(expr);

  cout << "Result: "<< result << endl;

  return 0;

}

double eval(string expr)

{

  // 将表达式转换为浮点数

  double num = stod(expr.substr(0, expr.find(" ")));

  // 获取运算符和操作数

  char op = expr[expr.find(" ") + 1];

  double operand = stod(expr.substr(expr.find(" ") + 3));

  // 执行数学运算

  if (op == '+')

    return num + operand;

  else if (op == '-')

    return num - operand;

  else if (op == '*')

    return num * operand;

  else if (op == '/')

    return num / operand;

  else if (op == '%')

    return fmod(num, operand);

  else if (op == '^')

    return pow(num, operand);

  else

  

    cout << "Invalid operator!";

    return 0;

  

}

2. 利用逆波兰表达式:

逆波兰表达式将表达式转换为后缀表达式。这种格式可以轻松地计算数学的顺序。我们可以使用栈数据结构来实现这个目的。以下是一个示例:


#include <iostream>

#include <stack>

#include <cmath>

using namespace std;

int main()

{

  string expr = "2 + 3 * 4";

  double result = eval(expr);

  cout << "Result: "<< result << endl;

  return 0;

}

double eval(string expr)

{

  stack<double> st;

  string num = "";

  double operand1, operand2;

  for (int i = 0; i < expr.length(); i++)

  {

    if (expr[i] == ' ')

      continue;

    else if (isdigit(expr[i]))

    {

      num += expr[i];

      if (!isdigit(expr[i + 1]))

      {

        st.push(stod(num));

        num = "";

      }

    }

    else

    {

      operand2 = st.top(); st.pop();

      operand1 = st.top(); st.pop();

      switch (expr[i])

      {

        case '+': st.push(operand1 + operand2); break;

        case '-': st.push(operand1 - operand2); break;

        case '*': st.push(operand1 * operand2); break;

        case '/': st.push(operand1 / operand2); break;

        case '%': st.push(fmod(operand1, operand2)); break;

        case '^': st.push(pow(operand1, operand2)); break;

      }

    }

  }

  return st.top();

}

现在你可以使用这些方法将字符串转换为表达式并执行它们。这些方法都具有各自的优缺点,取决于你的具体需求。要根据具体的情况自行选择适合自己的方法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复