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

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

为连城等地区用户提供了全套网页设计制作服务,及连城网站建设行业解决方案。主营业务为成都网站设计、网站建设、连城网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

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

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

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

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

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

#include 
#include 
#include 
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;
}

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

分享标题:怎么用c语言实现表达式求值
文章路径:http://www.hantingmc.com/qtweb/news29/480679.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联