c语言怎么求简单表达式的值
时间: 2024-12-17 14:37:39 浏览: 3
在C语言中,要计算一个简单的数学表达式的值,可以利用栈数据结构和递归来解析表达式。这种方法被称为逆波兰表示法(RPN, Reverse Polish Notation)。以下是一个基本的示例,它使用了递归和一个临时数组来存储操作数:
```c
#include <stdio.h>
#include <stack>
#include <ctype.h> // 需要用到ctype.h头文件中的isdigit()
#define MAX_TOKENS 100
// 函数定义
double evaluate_expression(char tokens[], int n); // 递归函数
void push_number(double num, double token[], int& i); // 将数字压入栈
double pop_and_evaluate(double token[], int& i); // 弹出栈顶元素并计算其结果
// 主函数
int main() {
char expression[MAX_TOKENS];
double token[MAX_TOKENS], result;
int i = 0;
// 输入表达式
printf("请输入一个简单的表达式(只包含数字和+-*/): ");
fgets(expression, sizeof(expression), stdin);
// 删除换行符
expression[strlen(expression) - 1] = '\0';
// 解析并计算表达式
if (evaluate_expression(expression, i)) {
printf("表达式结果: %.2lf\n", result);
} else {
printf("无效的表达式。\n");
}
return 0;
}
// 递归函数
double evaluate_expression(char tokens[], int n) {
if (n <= 0) // 栈为空,直接返回0
return 0;
double left = pop_and_evaluate(tokens, n); // 弹出栈顶元素并计算
double right = pop_and_evaluate(tokens, n); // 再弹出并计算
// 根据运算符执行相应的操作
switch (tokens[n - 1]) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/':
if (right != 0)
return left / right;
else
printf("Error: Division by zero is not allowed.\n");
return 0; // 同上处理除零
default:
printf("Invalid operator.\n");
return 0;
}
}
// 助手函数
void push_number(double num, double token[], int& i) {
token[i++] = num;
}
double pop_and_evaluate(double token[], int& i) {
if (i < 2) // 栈不满,无法弹出两个元素
return 0;
double num = token[--i]; // 弹出一个元素
return num;
}
阅读全文