函数对表达式进行计数
Function to count an expression
在C++(包含在某个库或头文件中)中是否有任何函数可以计算字符串中的表达式?
假设我们有一个字符串,它等于2 + 3 * 8 - 5
(但它取自用户的键盘,所以我们不知道在编写代码时它会是什么表达式),我们希望这个函数对它进行计数,但当然要按正确的顺序(1)。功率/根2。乘以/除以3。增加/减少)。
我试着把所有的数字都取成int数组,把运算符取成chars数组(好吧,实际上是向量,因为我不知道它会包含多少数字和运算符),但我不知道下一步该怎么办。
注意,我在问是否已经为此编写了任何函数,如果没有,我只想再试一次。
通过计数,我认为这意味着"评估表达式"。
您必须使用像boost::spirit这样的解析器生成器才能正确地执行此操作。如果你试着手写这篇文章,我保证所有参与者都会感到痛苦和痛苦。
尝试在这里查找计算器应用程序,有几个:
http://boost-spirit.com/repository/applications/show_contents.php
boost::spirit示例中还有一些简单的计算器风格语法。
非常令人惊讶的是,在我之前的其他人没有将您重定向到这种特殊的算法,这种算法很容易实现,并将您的字符串转换为这种特殊的东西,称为反向波兰符号(RPN)。在RPN中计算表达式很容易,困难的部分是实现Shutting Yard,但这是以前做过很多次的事情,你可能会找到很多关于这个主题的教程。
算法的快速概述:
-
PRN-RPN是一种编写表达式的方法,它不需要括号,因此可以更容易地进行计算。实际上,要计算一个这样的表达式,您需要从左到右遍历字符串,同时保留一堆操作数。每当遇到操作数时,都会将其推到堆栈上。每当遇到运算标记时,都要计算最后2个操作数的结果(当然,如果运算是二进制的,则仅当运算是一元的时,才计算最后一个),并将其推送到堆栈中。冲洗并重复,直到绳子末端。
-
分流场真的很难简单地概述,如果我真的尝试完成这项任务,这个答案最终会看起来很像我上面链接的维基百科文章,所以我会为我们俩省去麻烦。
Tl;DR;去读第一句中的链接。
您将不得不自己完成这项工作,因为没有处理中缀方程分辨率的标准库
如果你这样做了,请包括你正在尝试的代码,我们可以帮助你
- C++模板函数中的初始化 - 新的初始值设定项表达式列表被视为复合表达式
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 折叠表达式和函数名称查找
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 不是 lambda 函数中的常量表达式
- 保证逻辑 AND 表达式中的函数调用
- 函数调用在常量表达式中必须具有常量值
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 错误:表达式不能用作函数
- 使用表达式 SFINAE 的函数模板的类外定义
- std::cout 在打印变量与函数表达式时的行为不同
- 构造函数中缺少表达式
- 如何在使用模板的函数调用的大括号表达式中推导多维数组的大小
- C++98 中的常量表达式函数
- gcc 是否将非常量表达式函数的内置视为常量表达式
- 试图理解基本的正则表达式函数在c++
- 错误:','令牌之前的预期主表达式 //函数调用