【问题标题】:Comparing the characters [closed]比较字符[关闭]
【发布时间】:2016-02-05 20:01:04
【问题描述】:

我正在编写解决算术表达式的代码,例如:4+3-2*6*(3+4/2)

为此,我需要将字符串中的运算符与以下优先级进行比较:

1. ( or )
2. * or /
3. + or -

谁能告诉我如何比较两个字符。因为它们的 ASCII 值不是我想要的顺序!

【问题讨论】:

  • 为什么不自己做比较函数呢?
  • 是的,我可以做到这一点,但我正在寻找是否有其他有效的方法来做到这一点!就像我可以为运算符定义我的 ascii 值一样,我知道这是不可能的,但类似于..
  • 也.. 例如。我在 que 中给出的算术表达式。只是一个简单的版本。更复杂的算术表达式可能涉及其他抽象运算符,例如'$'、'%'、'^'、'@'、'&' 等,它们的运算定义在两个整数上并且优先于其他运算符。你不能只为此创建一个函数!编写该函数需要 100 行 ..(考虑从 n 个运算符中选择 3 个运算符进行比较)..

标签: c char


【解决方案1】:

使用查找表。如果使用 ASCII,它只是一个 256 个元素的表。你用 char 索引它。

【讨论】:

  • 你说的是什么意思..'index it with char'..请详细说明!
  • 如果变量c 中有一个字符并且数组是A,则只需执行A[c] 即可获取字符的优先级。
  • 如果我必须给两个或多个运算符相同的优先级怎么办.. 在这种情况下这不起作用.. 请阅读我在队列中的第三条评论。!
  • 为什么不呢?数组上的两个不同位置可以具有相同的值。
  • 推荐代码使用无符号索引A[c*1u]。签名char 时会出现问题。
【解决方案2】:

为此,我需要将字符串中的运算符与优先级进行比较 喜欢:

你可以这样做来获得每个字符的优先级:

int get_precedence (char c) {
    switch (c) {
        case '+':
        case '-': return 3;

        case '*':
        case '/': return 2;

        case '(':
        case ')': return 1;

        default: return -1;
    }
}

这使得根据需要添加附加字符变得非常容易。

但是,您仍然会遇到一些问题。例如,你将如何区分一元否定和减法?您需要为此查看上下文,因为答案将取决于之前发生的事情。处理中缀表示法是困难

要自己执行此操作,您需要编写 recursive descent parser 或使用 shunting yard algorithm。不管怎样,这将是几百行 hard 代码。然后你需要决定是从抽象语法树评估还是编译为字节码。

我正在编写解决算术表达式的代码 喜欢:4+3-2*6*(3+4/2)

如果您想以一种简单的方式解决这个问题,您应该找到一个预先存在的库。 TinyExpr 就是这样一种解决方案。它是开源的,包含在单个 C 源代码文件中。代码如下:

#include "tinyexpr.h"
double answer = te_interp("4+3-2*6*(3+4/2)", 0);

【讨论】:

  • 第一次很好的回答。 IMO,最好的。
【解决方案3】:

即使在 ASCII 中,整数的顺序仍然相同。您可以比较个位数。例如:

if ('7' > '2') 将评估为真

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多