c语言怎么输入表达式并不考虑运算符优先级求值
时间: 2024-10-06 19:05:59 浏览: 31
C语言运算符优先级列表(超详细)
5星 · 资源好评率100%
在C语言中,如果要让用户输入一个表达式并直接计算结果而不考虑运算符的优先级,可以采用栈数据结构来实现逆波兰表示法(Reverse Polish Notation, RPN)。这种方法也被称为后缀表达式。
以下是基本步骤:
1. **读取用户输入**:首先获取用户的输入字符串,包含数字和操作符。
2. **分离数字和运算符**:遍历字符串,将每个字符分为两部分:数字和运算符。这通常通过正则表达式或简单的循环实现。
3. **处理数字**:把所有的数字压入栈中。
4. **处理运算符**:遇到运算符时,从栈顶弹出两个操作数,并根据运算符执行相应的算术操作(如加减乘除),然后把结果压回栈中。
5. **计算最终结果**:当只剩下一个元素在栈中时,这个就是整个表达式的值。
下面是一个简单的示例程序(仅做演示,未优化,不包含错误检查):
```c
#include <stdio.h>
#include <stdlib.h>
int eval(char *token) {
return atoi(token);
}
double calculate(char *expression) {
int stack[100], top = -1;
char *token = strtok(expression, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-*/() ");
while (token != NULL) {
if (isdigit(*token)) {
stack[++top] = eval(token);
} else {
double op2 = stack[top--];
double op1 = stack[top--];
switch (*token) {
case '+':
stack[top++] = op1 + op2;
break;
case '-':
stack[top++] = op1 - op2;
break;
case '*':
stack[top++] = op1 * op2;
break;
case '/':
stack[top++] = op1 / op2;
break;
default:
printf("Invalid operator\n");
return 0; // 你可以选择如何处理非法操作符
}
}
token = strtok(NULL, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-*/() ");
}
return stack[top];
}
int main() {
char expression[100];
printf("Enter an expression without considering operator precedence: ");
fgets(expression, sizeof(expression), stdin);
// 移除末尾的换行符
expression[strlen(expression)-1] = '\0';
double result = calculate(expression);
if (result != 0)
printf("Result: %.2lf\n", result);
else
printf("Invalid expression or no result.\n");
return 0;
}
```
阅读全文