在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; }
这个程序首先将后缀表达式转换为抽象语法树,然后遍历这个树进行计算,注意,这个程序假设输入的后缀表达式是有效的,没有进行错误检查。
最新评论
本站CDN与莫名CDN同款、亚太CDN、速度还不错,值得推荐。
感谢推荐我们公司产品、有什么活动会第一时间公布!
我在用这类站群服务器、还可以. 用很多年了。