函数对表达式进行计数

Function to count an expression

本文关键字:表达式 函数      更新时间:2023-10-16

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,但这是以前做过很多次的事情,你可能会找到很多关于这个主题的教程。

算法的快速概述:

  1. PRN-RPN是一种编写表达式的方法,它不需要括号,因此可以更容易地进行计算。实际上,要计算一个这样的表达式,您需要从左到右遍历字符串,同时保留一堆操作数。每当遇到操作数时,都会将其推到堆栈上。每当遇到运算标记时,都要计算最后2个操作数的结果(当然,如果运算是二进制的,则仅当运算是一元的时,才计算最后一个),并将其推送到堆栈中。冲洗并重复,直到绳子末端。

  2. 分流场真的很难简单地概述,如果我真的尝试完成这项任务,这个答案最终会看起来很像我上面链接的维基百科文章,所以我会为我们俩省去麻烦。

Tl;DR;去读第一句中的链接。

您将不得不自己完成这项工作,因为没有处理中缀方程分辨率的标准库

如果你这样做了,请包括你正在尝试的代码,我们可以帮助你