c语言,用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。不用栈 有解说,简单易懂
时间: 2023-10-07 19:06:51 浏览: 169
可以采用递归下降法对输入的表达式进行语法分析和计算。具体做法如下:
1. 定义一个函数 `expr()`,表示对表达式的求值。
2. 在 `expr()` 函数内部,首先读入当前字符,若当前字符为负号,则将其与后面的数字拼接起来,形成一个负数。
3. 读入下一个数字,并将其存储为当前结果。
4. 读入下一个操作符,若为加减,则继续读入下一个数字,进行加减操作。若为乘除,则继续读入下一个数字,进行乘除操作。
5. 若当前操作符为左括号,则递归调用 `expr()` 函数,求出括号内的表达式的值。若当前操作符为右括号,则返回当前结果。
6. 重复步骤 3 ~ 5,直到读完整个表达式。
7. 最后返回当前结果即可。
下面是一个简单的示例代码:
```c
#include <stdio.h>
int get_num(char *s, int *p)
{
int num = 0, flag = 1;
if (s[*p] == '-')
{
flag = -1;
(*p)++;
}
while (s[*p] >= '0' && s[*p] <= '9')
{
num = num * 10 + s[*p] - '0';
(*p)++;
}
return num * flag;
}
int expr(char *s, int *p)
{
int res = get_num(s, p);
while (s[*p] != '\0' && s[*p] != ')')
{
char op = s[(*p)++];
if (op == '+')
res += get_num(s, p);
else if (op == '-')
res -= get_num(s, p);
else if (op == '*')
res *= get_num(s, p);
else if (op == '/')
res /= get_num(s, p);
else if (op == '(')
res = expr(s, p);
}
return res;
}
int main()
{
char s[100];
printf("请输入表达式:");
scanf("%s", s);
int p = 0;
int ans = expr(s, &p);
printf("表达式的值为:%d\n", ans);
return 0;
}
```
注意,这个方法虽然没有用到栈,但是使用了递归调用函数,也需要考虑函数调用栈的压栈和弹栈问题。在输入的表达式比较复杂时,可能会导致栈溢出,因此在实际使用时需要注意。
阅读全文