【问题标题】:Function to count an expression计算表达式的函数
【发布时间】:2013-12-08 21:54:04
【问题描述】:

C++ 中是否有任何函数(包含在某些库或头文件中)可以从字符串中计算表达式?

假设我们有一个字符串,它等于2 + 3 * 8 - 5(但它是从用户的键盘上获取的,所以我们在编写代码时不知道它到底是什么表达式),我们希望这个函数可以计算它,但当然顺序正确(1. 幂/根 2. 倍/除 3. 增加/减少)。

我尝试将所有数字放入一个整数数组,将运算符放入一个字符数组(好吧,实际上是向量,因为我不知道它将包含多少个数字和运算符),但我'我不知道下一步该做什么。

注意,我问的是是否已经为此编写了任何函数,如果没有,我将再试一次。

【问题讨论】:

标签: c++ string count expression


【解决方案1】:

按计数,我将其理解为“评估表达式”。

您必须使用像 boost::spirit 这样的解析器生成器才能正确执行此操作。如果您尝试手写此内容,我保证所有相关人员都会感到痛苦和痛苦。

尝试在这里寻找计算器应用程序,有几个:

http://boost-spirit.com/repository/applications/show_contents.php

boost::spirit 示例中还有一些简单的计算器式语法。

【讨论】:

  • 谢谢,我会试试这个:)。
  • 您可以链接到现有的相关问题,而不是链接到那个旧示例页面:) stackoverflow.com/questions/15123412/…
  • 编写一个 4 键计算器的代码很简单,也是一个值得练习的练习。
【解决方案2】:

非常令人惊讶的是,在我之前的其他人并没有将您重定向到 this particular algorithm,这很容易实现并将您的字符串转换为这种称为 Reverse Polish Notation (RPN). 的特殊东西 在 RPN 中计算表达式很容易,困难的部分是实现 Shutting Yard 但它以前做过很多次的事情,你可能会发现很多关于这个主题的教程。

算法概览:

  1. PRN - RPN 是一种编写表达式的方法,无需括号,因此可以更轻松地进行计算。实际上,要计算一个这样的表达式,您需要从左到右遍历字符串,同时保留一堆操作数。每当遇到一个操作数时,就将其压入堆栈。每当遇到操作令牌时,您都会在最后两个操作数上计算其结果(当然,如果操作是二元的,则仅当它是一元时才计算最后一个)并将其压入堆栈。冲洗并重复直到字符串结束。

  2. Shunting Yard 确实更难简单概述,如果我确实尝试完成这项任务,这个答案最终会看起来很像我上面链接的维基百科文章,所以我会把这个麻烦留给我们俩.

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

【讨论】:

  • 我要试试这个,但由于我对编程很陌生,数学不太好(初中),我不确定我是否会理解这个。然而正如我所说 - 我要试试这个:)。
【解决方案3】:

您必须自己做这件事,因为没有处理中缀方程解析的标准库

如果您这样做,请提供您正在尝试的代码,我们可以帮助您

【讨论】:

  • 如果您不关心性能,调用外部应用程序为您执行此操作是一个不错的选择。选中 popen() 和 'bc' 作为选项。
  • @nyrl 非常聪明 - 我只是在回答是否存在任何 标准 ,但我很确定不存在。由于问题可能含糊不清 - 如果您想解释 popen,建议将其作为解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多