以字符序列的形式从中端输入语法正确,不含变量的表达式;表示算符优先关系;实现算术四则混合运算表达式求值写出c语言数据结构代码
时间: 2024-12-17 18:52:21 浏览: 3
数据结构大作业C++实现简单的计算器——算术表达式计算(包含实验报告)
5星 · 资源好评率100%
在C语言中,为了处理四则运算的混合表达式并考虑算符优先级,可以使用递归下降解析器(Recursive Descent Parser)或者堆栈算法(如Shunting Yard Algorithm)。这里我们简单地展示如何使用堆栈实现一个简单的表达式求值函数。我们将使用`token.h`头文件定义一些基本的常量和枚举,以及`expression.h`用于存储表达式的数据结构。
首先,创建`token.h`:
```c
#ifndef TOKEN_H
#define TOKEN_H
typedef enum {
PLUS,
MINUS,
MUL,
DIV,
LPAREN,
RPAREN,
NUMBER,
END_OF_FILE,
ILLEGAL
} TokenType;
const char* token_names[] = {"+", "-", "*", "/", "(", ")", "NUMBER", "", "ILLEGAL"};
#endif
```
接下来,创建`expression.h`:
```c
#ifndef EXPRESSION_H
#define EXPRESSION_H
#include <stdio.h>
#include <stdlib.h>
#include "token.h"
typedef struct ExpressionNode {
union {
double value;
struct ExpressionNode* operatorNode;
};
enum TokenType type;
} ExpressionNode;
ExpressionNode* createNumber(double number);
ExpressionNode* createOperator(TokenType op, ExpressionNode* left, ExpressionNode* right);
double evaluateExpression(ExpressionNode* root);
void printExpression(ExpressionNode* node);
#endif // EXPRESSION_H
```
然后,在`expression.c`中实现相关的函数:
```c
#include "expression.h"
// 创建数字节点
ExpressionNode* createNumber(double number) {
ExpressionNode* node = (ExpressionNode*) malloc(sizeof(ExpressionNode));
node->type = NUMBER;
node->value = number;
return node;
}
// 创建操作符节点,并处理左、右子节点
ExpressionNode* createOperator(TokenType op, ExpressionNode* left, ExpressionNode* right) {
ExpressionNode* node = (ExpressionNode*) malloc(sizeof(ExpressionNode));
node->type = op;
node->operatorNode = left;
if (right)
node->operatorNode->right = right;
return node;
}
// 根据中缀表达式计算结果
double evaluateExpression(ExpressionNode* root) {
switch (root->type) {
case NUMBER:
return root->value;
case PLUS:
return evaluateExpression(root->operatorNode->left) + evaluateExpression(root->operatorNode->right);
case MINUS:
return evaluateExpression(root->operatorNode->left) - evaluateExpression(root->operatorNode->right);
case MUL:
return evaluateExpression(root->operatorNode->left) * evaluateExpression(root->operatorNode->right);
case DIV:
if (evaluateExpression(root->operatorNode->right) != 0)
return evaluateExpression(root->operatorNode->left) / evaluateExpression(root->operatorNode->right);
else
return INFINITY; // 或者抛出错误
default:
printf("Invalid expression.\n");
exit(1);
}
}
// 打印表达式便于测试
void printExpression(ExpressionNode* node) {
if (node->type == NUMBER)
printf("%.2f ", node->value);
else
printf("(%s %s %s)\n", token_names[node->type], printExpression(node->operatorNode->left), printExpression(node->operatorNode->right));
}
int main() {
// 测试代码片段
ExpressionNode* expr = createOperator(MUL, createNumber(4), createNumber(5)); // 4 * 5
printf("Value of the expression is %.2f\n", evaluateExpression(expr));
free(expr); // 清理内存
return 0;
}
```
以上代码实现了基础的中缀表达式求值功能。你可以将用户输入的表达式字符串转换为这样的结构,然后调用`evaluateExpression()`函数求解。注意这只是一个简化的版本,实际应用中可能需要更复杂的数据结构来处理完整的问题,包括处理括号和优先级等。此外,这个例子未包含完整的输入和转换过程,这部分你需要另外设计。
阅读全文