在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)