C语言数据结构求表达式 1+2*3-16/2的值
时间: 2024-10-18 14:08:36 浏览: 23
数据结构课程设计-表达式求值C语言.zip
在C语言中,计算数学表达式的值通常需要使用栈数据结构来模拟运算过程。这里我们可以通过递归函数和一个简单的操作数栈来实现。首先,你需要将原始的字符串转换成字符数组表示的中间形式,然后遍历这个数组,遇到数字就压入栈,遇到运算符则弹出栈顶两个元素进行相应的计算。
下面是大致的步骤:
1. 定义一个字符数组`expr`存储输入的表达式。
2. 定义一个整数栈`stack`和一个临时变量`temp`用于储存数值。
3. 遍历`expr`,对于每个字符:
- 如果是数字,将其转换为整数并压入栈。
- 如果是运算符('+', '-', '*', '/'),弹出栈顶的两个操作数进行计算并将结果压回栈。
4. 当遍历完所有字符后,栈顶剩下的就是最终的结果。
下面是一个简化版的C代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
int precedence(char op) {
return (op == '+' || op == '-') ? 1 : (op == '*' || op == '/') ? 2 : 0;
}
double apply_operator(int a, int b, char op) {
switch(op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return (b != 0) ? a / b : INT_MIN; // 防止除数为零
}
}
double calculate_expression(char *expr) {
stack = malloc(sizeof(int) * MAX_STACK_SIZE); // 初始化栈
int top = -1;
for (int i = 0; expr[i] != '\0'; i++) {
if (isdigit(expr[i])) {
double num = 0;
while (i < strlen(expr) && isdigit(expr[i])) { // 读取连续的数字
num = num * 10 + (expr[i] - '0');
i++;
}
i--;
top++;
stack[top] = num;
} else if (expr[i] == '(') {
top++;
stack[top] = i; // 记录左括号的位置
} else if (expr[i] == ')') {
i = stack[stack[top]] + 1; // 跳过左括号
top--;
} else {
while (top > 0 && precedence(stack[top]) >= precedence(expr[i])) {
i = stack[top] + 1; // 跳过前一个运算符
top--;
}
top++;
stack[top] = i; // 保存当前位置
}
}
double result = stack[top];
while (top > 0) {
i = stack[top]; // 从栈顶开始处理运算符
result = apply_operator(result, stack[top - 1], expr[i]);
top -= 2;
}
free(stack);
return result;
}
int main() {
char expr[] = "1+2*3-16/2";
double result = calculate_expression(expr);
printf("表达式 %s 的值是: %.2f\n", expr, result);
return 0;
}
```
请注意这只是一个基础示例,实际应用中可能还需要考虑更复杂的情况,如处理优先级、括号等。
阅读全文