上一篇
怎么用c语言实现表达式求值
- 行业动态
- 2024-03-30
- 2562
在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; }
这个程序首先将后缀表达式转换为抽象语法树,然后遍历这个树进行计算,注意,这个程序假设输入的后缀表达式是有效的,没有进行错误检查。
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/298018.html