用C语言计算器从左往右求值,所有运算符的优先级一样,输入表达式求值
时间: 2024-10-09 14:10:20 浏览: 36
在C语言中,为了实现一个简单的从左到右求值、运算符优先级相同的计算器,你可以使用递归算法结合栈数据结构。由于所有的运算符优先级相等,我们不需要复杂的解析树,而是可以直接遍历输入字符串,依次处理每个字符。
以下是一个基本的步骤:
1. 定义一个函数 `evaluate`,接受一个字符串作为参数。
2. 初始化两个指针:一个指向当前待处理的字符(left),一个指向操作数栈的顶部(top)。
3. 遍历输入字符串:
- 如果遇到数字,就不断读取直到遇到非数字字符,并将它们转换成整数压入栈。
- 如果遇到运算符,取出栈顶的两个操作数进行计算,然后将结果替换掉栈顶的操作数,再继续处理下一个运算符。
4. 遇到字符串结尾,如果栈内仍有操作数未处理,则弹出栈顶剩余的操作数并计算最终结果。
以下是简化版的伪代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int precedence(char op) {
// 根据实际需求定义运算符优先级
return 0; // 具体实现这里假设所有运算符优先级相等
}
double calculate(char *expression) {
stack_t *stack = create_stack();
char *left = expression;
int top = -1;
while (*left != '\0') {
if (isdigit(*left)) { // 处理数字
int num = 0;
while (isdigit(*++left)) {
num = num * 10 + (*left - '0');
}
push(stack, (void*)num);
} else { // 处理运算符
double right = *(double*)pop(stack);
double left_num = *(double*)pop(stack);
if (precedence(*left) <= precedence(stack[top])) {
double result = perform_operation(left_num, right, *left); // 模拟操作,如加减乘除
push(stack, (void*)&result);
} else {
push(stack, (void*)&right);
}
}
}
return *(double*)pop(stack);
}
// 用于创建、获取栈顶元素和删除栈顶元素的辅助函数
int main() {
char expression[] = "5 + 3 * 2"; // 示例输入
printf("Result: %.2f\n", calculate(expression));
return 0;
}
```
注意这只是一个简化的示例,实际实现中可能需要考虑更多边界情况,比如空串、非法字符以及完整处理表达式的结束符号。此外,上述代码假设了所有运算符都是二元的,并通过 `perform_operation` 函数模拟具体的算术操作。
阅读全文