#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
// 定义一个结点
typedef struct Node {
char operator;
int value;
struct Node* left;
struct Node* right;
} Node;
Node* createNode(char op, int val, Node* left, Node* right) {
Node* node = malloc(sizeof(Node));
if(node != NULL) {
node->operator = op;
node->value = val;
node->left = left;
node->right = right;
}
return node;
}
Node* parseExpr(const char** expr);
// 解析数字
int parseNumber(const char** expr) {
int val = 0;
while(isdigit(**expr)) {
val = val * 10 + **expr - '0';
*expr += 1;
}
return val;
}
// 解析因子
Node* parseFactor(const char** expr) {
if(**expr == '(') {
*expr += 1;
Node* node = parseExpr(expr);
*expr += 1;
return node;
} else {
int val = parseNumber(expr);
return createNode('\0', val, NULL, NULL);
}
}
//解析算术
Node* parseTerm(const char** expr) {
Node* node = parseFactor(expr);
while(**expr == '*' || **expr == '/') {
char op = **expr;
*expr += 1;
Node* right = parseFactor(expr);
node = createNode(op, 0, node, right);
}
return node;
}
//解析表达式
Node* parseExpr(const char** expr) {
Node* node = parseTerm(expr);
while(**expr == '+' || **expr == '-') {
char op = **expr;
*expr += 1;
Node* right = parseTerm(expr);
node = createNode(op, 0, node, right);
}
return node;
}
// 计算
int compute(Node* node) {
switch(node->operator) {
case '+': return compute(node->left) + compute(node->right);
case '-': return compute(node->left) - compute(node->right);
case '*': return compute(node->left) * compute(node->right);
case '/': return compute(node->left) / compute(node->right);
default: return node->value;
}
}
// 打印二叉树
void printTree(Node* node) {
if(node->operator == '\0') {
printf("%d", node->value);
} else {
printf("(");
printTree(node->left);
printf(" %c ", node->operator);
printTree(node->right);
printf(")");
}
}
int main(void) {
char expr[256];
printf("Enter an expression: ");
gets(expr);
const char* p = expr;
Node* tree = parseExpr(&p);
printTree(tree);
printf("\n");
printf("The result is: %d\n", compute(tree));
return 0;
}