方法1:c
四则运算,递归解法分析,最简洁的代码
大佬的递归解法,也可以称为消消乐解法,这是我见过最简洁的表达式求值代码。看到这种解法之后我都不想去看什么逆波兰了。。。首先声明,我只是个搬运工。
第一步,先考虑无括号的情况,先乘除后加减,这个用栈很容易解决,遇到数字先压栈,如果下一个是乘号或除号,先出栈,和下一个数进行乘除运算,再入栈,最后就能保证栈内所有数字都是加数,最后对所有加数求和即可。
第二步,遇到左括号,直接递归执行第一步即可,最后检测到右括号,返回括号内的计算结果,退出函数,这个结果作为一个加数,返回上一层入栈。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int pos;
int compute(char* data)
{
int len = strlen(data);
int stack[1000];
int top = -1;
int num = 0;
char flag = '+';
while (pos < len) {
if (data[pos] == '{' || data[pos] == '[' || data[pos] == '(') {
pos++;
num=compute(data);
}
while (pos < len && isdigit(data[pos])) {
num = num*10 + data[pos] -'0';
pos++;
}
switch (flag) {
case '+':
stack[++top] = num;
break;
case '-':
stack[++top] = -num;
break;
case '*':
stack[top] *= num;
break;
case '/':
stack[top] /= num;
break;
}
num = 0;
flag = data[pos];
if (data[pos] == '}' || data[pos] == ']'|| data[pos] == ')') {
pos++;
break;
}
pos++;
}
int res = 0;
for (int i = 0; i <= top; i++) {
res += stack[i];
}
return res;
}
int main()
{
char data[1000];
while (scanf("%s", data) != EOF) {
pos = 0;
int res = compute(data);
printf("%d\n", res);
}
return 0;
}方法2:python
while True:
try:
s=input()
print(eval(s))
except:
break 
京公网安备 11010502036488号