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