如何进行字符串中指定的算术运算?

时间:2017-04-03 05:44:22

标签: c++ string

抱歉我缺乏英语技能。

我想做一个字符串中指定的算术运算,例如“1 + 3 * 11 - 7/18”。

乘法和除法的优先级高于加法和减法。在具有相同优先级的操作的情况下,操作按从左到右的顺序执行。

我编写了计算加法的代码。但我无法进入下一步。

#include <iostream>
#include <string>

using namespace std;

int main() {
  string s;
  cout << "Enter an arithmetic operation EX) 1 + 3 * 11 + 7 / 18 " << endl;
  getline(cin, s, '\n'); 
  int sum = 0;
  int search = 0; 

  while(true) {
      int plus = s.find('+', search);
      if(plus == -1) { 
          string aos = s.substr(search);
          if(aos == "") break; 
          cout << aos << endl;
          sum += stoi(aos); 
          break;
      }

      int count = plus - search; 
      string aos = s.substr(search, count);  
      cout << aos << endl;
      sum += stoi(aos);
      search = plus+1; 

   }
   cout << "Result is " << sum;
}

1 个答案:

答案 0 :(得分:0)

没有内置的方法来解析和评估字符串。您需要编写自己的代码才能执行此操作。

通常,表达评估分两步进行:

  1. <强>扫描即可。不要使用单个字符串,而是将输入分成单个单元,称为标记。例如,字符串5 * 3 + 2可能会变成序列["5", "*", "3", "+", "2"]。通过提前执行此步骤,您可以更轻松地使用以后的数量,因为不需要进行大量复杂的字符串处理。

  2. <强>评价即可。给定令牌序列,确定表达式的计算结果。

  3. 您正在采取的方法 - 寻找操作员并对其进行评估 - 可以起作用。您将首先要搜索最高优先级运算符以进行评估。例如,在字符串5 * 3 + 2中,您需要在5 * 3之前评估3 + 2

    但是,还有其他更快更清洁的方法。 Dijkstra的shunting-yard algorithm使用两个堆栈来计算表达式,并且编码相对简单。我建议从那里开始 - 每次我需要手工制作表达评估员时,我都转向这种特殊方法。

    还有其他重量级选项。您可以在线查找表达式解析库,也可以使用flexbison之类的工具自动生成解析器。不过,我怀疑你的需求太过分了。