当前位置:首页 > 行业动态 > 正文

怎么用c语言实现表达式求值

在C语言中,实现表达式求值可以通过以下步骤完成:

1、词法分析:将输入的字符串分解成一个个的标记(token),这些标记可以是数字、运算符、括号等。

2、语法分析:根据预先定义的语法规则,将这些标记组合成一个抽象语法树(AST)。

3、语义分析:遍历这个抽象语法树,检查其是否符合语义规则,检查除数是否为零,检查括号是否正确配对等。

4、计算:遍历这个抽象语法树,进行实际的计算。

以下是一个简单的实现,只支持加减乘除和括号,没有考虑错误处理和优化。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node {
    char op;
    struct Node* left;
    struct Node* right;
} Node;
Node* newNode(char op) {
    Node* node = (Node*)malloc(sizeof(Node));
    node>op = op;
    node>left = NULL;
    node>right = NULL;
    return node;
}
int evaluate(Node* root) {
    if (root == NULL) return 0;
    if (root>op == '+') return evaluate(root>left) + evaluate(root>right);
    if (root>op == '') return evaluate(root>left) evaluate(root>right);
    if (root>op == '*') return evaluate(root>left) * evaluate(root>right);
    if (root>op == '/') return evaluate(root>left) / evaluate(root>right);
    return atoi(&root>op);
}
Node* constructTree(char* postfix) {
    Node* stack[strlen(postfix)];
    int top = 1;
    for (int i = 0; i < strlen(postfix); i++) {
        if (isdigit(postfix[i])) {
            stack[++top] = newNode(postfix[i]);
        } else {
            Node* t = newNode(postfix[i]);
            t>right = stack[top];
            t>left = stack[top];
            stack[++top] = t;
        }
    }
    return stack[top];
}
void inorder(Node* root) {
    if (root != NULL) {
        inorder(root>left);
        printf("%c ", root>op);
        inorder(root>right);
    }
}
int main() {
    char postfix[] = "231*+9";
    Node* root = constructTree(postfix);
    printf("Infix expression isn");
    inorder(root);
    printf("nEvaluation of expression is %d", evaluate(root));
    return 0;
}

这个程序首先将后缀表达式转换为抽象语法树,然后遍历这个树进行计算,注意,这个程序假设输入的后缀表达式是有效的,没有进行错误检查。

0