C语言 运用栈 写程序实现求解用户输入的表达式的值,例如输入1+2*3-16/2,则输出为-1
时间: 2024-10-15 21:19:16 浏览: 35
在C语言中,要实现一个简单的表达式求值器,我们可以利用栈数据结构来模拟计算过程。这里是一个基本的步骤:
1. 定义一个函数`evaluate_expression()`,接受用户输入的字符串作为参数。
2. 创建两个栈:一个用于存储操作数(整数值),另一个用于存储运算符及其优先级。
3. 遍历输入的表达式,遇到数字就压入操作数栈;遇到运算符则比较其优先级,并根据规则执行相应的操作。
4. 对于运算符,我们通常处理加法、减法、乘法和除法。遵循"左结合"的原则,即先处理最左边的相同优先级运算符。
5. 当遇到右括号时,意味着一个完整表达式的结束,从操作数栈弹出操作数,并计算结果直到遇到左括号。
6. 最终,当遍历完所有字符后,如果还有剩余的操作数,计算并返回最后一个结果。
下面是一个简化的伪代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
int precedence(char op) {
// 根据运算符的优先级定义,例如:'*' > '+' > '-' > '/'
}
void apply_operator(int *ops, int *ops_ptr, int *operators, int *operators_ptr) {
int b = *ops_ptr--;
int a = *ops_ptr--;
switch (*operators_ptr--) {
case '+':
*ops_ptr = a + b;
break;
case '-':
*ops_ptr = a - b;
break;
case '*':
*ops_ptr = a * b;
break;
case '/':
if (b != 0)
*ops_ptr = a / b;
else {
printf("Error: Division by zero");
return;
}
break;
}
}
int evaluate_expression(char *expression) {
stack_t ops; // 操作数栈
stack_t operators; // 运算符栈
for (int i = 0; expression[i]; ++i) {
if (isdigit(expression[i])) {
int num = 0;
while (isdigit(expression[i])) {
num = num * 10 + (expression[i] - '0');
++i;
}
push(ops, &num);
} else {
while (!is_empty(operators) && precedence(expression[i]) <= precedence(top(operators))) {
apply_operator(&top(ops), &ops_top, operators, &operators_top);
pop(operators);
}
push(operators, expression[i]);
}
}
while (!is_empty(operators)) {
apply_operator(&top(ops), &ops_top, operators, &operators_top);
pop(operators);
}
return top(ops); // 返回最终的结果
}
int main() {
char expression[] = "1+2*3-16/2";
int result = evaluate_expression(expression);
printf("Result: %d\n", result);
return 0;
}
```
请注意,这个例子是一个简化版,实际实现中需要考虑错误处理(如缺少闭合括号等)以及更复杂的情况,比如支持负数、小数和科学计数法表示的数字。此外,这个代码片段仅做教学演示,可能需要优化和调整以适应实际项目需求。
阅读全文