算术表达式求解代码(c语言)
时间: 2024-09-26 11:05:35 浏览: 33
算术表达式求解数据结构课设
在C语言中,可以编写函数来解析并求解算术表达式。一种常见的方法是使用递归下降解析算法。下面是一个简单的例子,展示了如何通过栈来计算基本的加减乘除运算:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int oper; // 运算符
double num; // 操作数
} Token;
// 解析一个数字
double getNumber(const char* token) {
double result = 0;
while (isdigit(*token)) {
result = result * 10 + (*token - '0');
++token;
}
return atof(token);
}
// 获取下一个运算符或结束标记
Token getNextToken(char* expression) {
Token token;
if (*expression == '\0') {
token.oper = EOF;
} else if (isdigit(*expression) || *expression == '.') {
token.num = getNumber(expression);
expression += strlen(token.num) + 1;
} else {
token.oper = *expression++;
}
return token;
}
// 计算表达式
double calculate(const char* expression) {
Stack tokens;
Stack_Init(&tokens);
Token current;
while (current.oper != EOF) {
Stack_Push(&tokens, current);
current = getNextToken(expression);
if (current.oper == '+') {
double b = Stack_Pop(&tokens).num;
double a = Stack_Pop(&tokens).num;
Stack_Push(&tokens, (Token){'+', a + b});
} else if (current.oper == '-') {
double b = Stack_Pop(&tokens).num;
double a = Stack_Pop(&tokens).num;
Stack_Push(&tokens, (Token){'-', a - b});
} else if (current.oper == '*') {
double b = Stack_Pop(&tokens).num;
double a = Stack_Pop(&tokens).num;
Stack_Push(&tokens, (Token){'*', a * b});
} else if (current.oper == '/') {
double b = Stack_Pop(&tokens).num;
double a = Stack_Pop(&tokens).num;
if (b != 0)
Stack_Push(&tokens, (Token){'/', a / b});
else
printf("Error: Division by zero.\n");
}
}
double result = Stack_Pop(&tokens).num;
Stack_Destroy(&tokens);
return result;
}
int main() {
const char* expr = "5 + 3 * 2";
double result = calculate(expr);
printf("Result: %lf\n", result);
return 0;
}
```
这个程序会解析输入的字符串表达式,并根据操作符执行相应的计算。注意这仅限于最基础的四则运算,对于更复杂的表达式如括号、优先级等,需要更复杂的设计。
阅读全文