簡體   English   中英

使用C中的遞歸評估算術表達式

[英]Evaluating Arithmetic Expression Using Recursion in C

這是一種使用遞歸評估算術表達式的算法:

  • 查找操作數1
  • t1 = Eval(操作數1)
  • 查找操作數2
  • t2 = Eval(操作數2)
  • 在t1和t2上應用運算符

假設:

  • 每個操作數在兩個運算符之間
  • 只有二​​進制運算

  • 每個操作都有括號(包括最外面的括號)

輸入:

  • 表示算術表達式的標記數組

  • num_tokens是令牌數

令牌示例數組:{“(”,“ 9”,“ +”,“(”,“ 50”,“-”,“ 25”,“)”,“)”}

我嘗試實現該算法,但是我的程序無法運行(退出狀態-1是我收到的唯一消息)。 為什么會這樣呢?

int apply(char op, int a, int b) {
       if (op == '+'){
        printf("%d %c %d\n", a,op,b);
        return a + b;
       }
       else if (op == '-'){
        printf("%d %c %d\n", a,op,b);
        return a - b;
       }
       else if(op == '/'){
        printf("%d %c %d\n", a,op,b);
        return a / b;
       }
       else if(op == '*'){
        printf("%d %c %d\n", a,op,b);
        return a * b;
       }
}   

int eval_tokens(char** expression, int num_tokens)
{
  // implement me
    int index;
    int opIndex = find_operator(expression, num_tokens); //find index of operator
    int count1=0,count2=0,term1,term2,i,j;

    if(*expression[0] == '(')
      i = 1;
    else
      i = 0;

    while(i <= opIndex){
        i++;
        count1++;
    }

    term1 = eval_tokens(expression+1,count1);

    j = opIndex+1;
    while(j < num_tokens){
      count2++;
      j++;
    }

  term2 = eval_tokens(expression+opIndex+1,count2); //expression+opIndex+1 points to index after opIndex
  return apply(*expression[opIndex], term1, term2);
}

int main(void) {
    char*expression[] = {"(", "(", "5", "+", "3", ")", "-", "(", "2", "+", "1", ")", ")"};
    printf("result = %d\n", eval_tokens(expression, 13));
    return 0;
}

要將str (或expression )用作堆棧,您可以從中刪除項目,請在遞歸函數中將這些參數設為“可修改”。 因此,您可以引入第二個函數int eval_tokens_recursive(char*** expression, int *num_tokens) ,該int eval_tokens_recursive(char*** expression, int *num_tokens)具有更高的間接級別,並且實際上可以通過更改參數的值來“從堆棧中獲取項目”。

該代碼如下所示。 希望能幫助到你。

int eval_tokens_recursive(char*** expression, int *num_tokens) {

    char *token = **expression;
    if (*num_tokens == 0) {
        printf("expecting more tokens.\n");
        exit(1);
    }
    if (*token == '(') { // begin of expression?
        (*expression)++;  // skip opening brace
        (*num_tokens)--;

        // lhs
        int lhs = eval_tokens_recursive(expression, num_tokens);

        // operand
        char operand = ***expression;
        (*expression)++;
        (*num_tokens)--;

        // rhs
        int rhs = eval_tokens_recursive(expression, num_tokens);

        (*expression)++;  // skip closing brace
        (*num_tokens)--;

        switch (operand) {
            case '+':
                return lhs + rhs;
            case '-':
                return lhs - rhs;
            case '*':
                return lhs * rhs;
            case '/':
                return lhs / rhs;
            default:
                return 0;
        }

    } else { // not an expression; must be a numeric token
        int operand;
        if (sscanf(token, "%2d", &operand) != 1) {
            printf("expecting numeric value; cannot parse %s.\n", token);
            exit(1);
        }
        (*expression)++;
        (*num_tokens)--;
        return operand;
    }

}

int eval_tokens(char** expression, int num_tokens) {
    return eval_tokens_recursive(&expression, &num_tokens);
}

int main() {

    char *expressions[] = {"(", "9", "+", "(", "50", "-", "25", ")", ")"};

    int result = eval_tokens(expressions, 9);

    printf("result: %d\n", result);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM