如何正确解析算术表达式中的数字,区分正面和负面的数字?

时间:2016-08-28 23:39:03

标签: c string parsing calculator arithmetic-expressions

我在Data Structures类中有一个赋值,我必须编写一个计算器来解决带有4个基本操作和括号的算术表达式,输入是通过stdin缓冲区完成的,输出是相同的。

一开始很容易,老师为我们提供了算法(如何将表达式从中缀转换为后缀以及如何评估它),唯一的目标是让我们实现自己的堆栈并使用它,但计算器本身效果不好,我认为这是因为我的解析器。

This is the algorithm和我的代码,用于解析数字,运算符和括号,同时将它们放入数组中以便于以后更容易评估的方式存储表达式。

// saida is an array of pairs of integers, the first value of the pair is the value of the info (the number itself or the ASCII value of the operator)
// The second value is an indicator of whether it is a number or a operator
for (i = 0; i < exp_size; i++) {
    c = expression[i];

    // If the current char is a digit, store it into a helper string and keep going until a non-digit is found
    // Then atoi() is used to transform this string into an int and then store it.
    if (c >= '0' && c <= '9') {
        j = 1, k = i+1;
        tempInt[0] = c;
        while(expression[k] >= '0' && expression[k] <= '9') {
            tempInt[j++] = expression[k];
            k++;
        }
        tempInt[j] = '\0';
        saida[saidaIndex][0] = atoi(tempInt);
        saida[saidaIndex++][1] = 0;
        i = k-1;
    }

    // If the character is an operator, the algorithm is followed.
    else if (c == '+' || c == '-' || c == '*' || c == '/') {
        while(pilha->size > 0 && isOpBigger( stack_top(pilha), c )) {
            saida[saidaIndex][0] = stack_pop(pilha);
            saida[saidaIndex++][1] = 1;
        }
        stack_push(c, pilha);
    }
    else if (c == '(') stack_push(c, pilha);
    else if (c == ')') {
        j = stack_pop(pilha);
        while(j != '(') {
            saida[saidaIndex][0] = j;
            saida[saidaIndex++][1] = 1;
            j = stack_pop(pilha);
        }
    }
}

问题是,在这段代码中我无法判断一个减号表示一个减法运算符或一个负数(我知道一个减号运算符是一个带负数的和,但它没有&#39;我帮我解决了这个问题),我想到了以下几点,没有成功:

  • 每次有减号时,请存储加号,然后让下一个数字为* -1。如果下一个数字已经是负数,或者减号位于带有括号的表达式之前,如果不是1 + 2 - (3 * 4),则不会起作用。
  • 如果减号后面有空格,则为操作员,否则为负数。不会起作用,因为输入中没有这些规则。

我对口译员没有任何经验,我真的不知道如何继续。代码与没有负数的有效表达式完美配合,但不是像()+ 3 - ()那样奇怪的表达式,但这是另一个问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这就是所谓的“一元减号”问题,在你的情况下(没有变量)可以通过替换得到解决。

如果

,则运算符-是一元减号
  • 前面有左括号
  • 前面是另一个运营商
  • 输入的第一个字符

现在,不是存储-,而是存储一个不同的字符,例如m,并为其指定比其他运算符更高的优先级(如果有的话,则与指数运算符相同)。

另一个提示:不要使用空格来表示任何内容,算术表达式必须没有任何空格或不正确。