用了python_zhang的代码,可谓最简洁的了,厉害了🐂
针对 100*-2这种按理说不该出现的情况使用f_new变量进行了修正
#include <stdio.h> #include <string.h> // 1.无括号 用栈先乘除后加减 // 遇到+-继续入栈,遇到*/出栈1个,和新元素计算后入栈 // 2.有括号 左括号开始递归1步骤,右括号出递归结果 入栈 //注意遇到括号内有负号先要变号再入栈 int i; int compute(char *data); int main() { char str[1000]; scanf("%s", str); i=0; int res = compute(str); printf("%d", res); return 0; } int compute(char *data) { int stack[1000]; //栈中只装加法运算的操作数,一个元素代表+、- xxx +、-中的xxx int top = -1; int len = strlen(data); char flag = '+'; while (i <=len) { int num = 0; int f_new = 0; // 用来将最开始或者括号后的减变为负号 if((flag=='*' || flag=="/")&&data[i]=='-'){ i++; f_new=1; } else if(data[i]=='-'){ flag = '-'; i++; } // 左括号开始递归 if (data[i] == '{' || data[i] == '[' || data[i] == '(') { i++; num = compute(data); } // 读取数据--从最高位读取的计算该值的实际大小的方法 while (data[i] - '0' >= 0 && data[i] - '0'<=9) { num = num * 10 + data[i] - '0'; i++; } if(f_new==1){ num = -num; f_new = 0; } switch(flag) { case '+': stack[++top] = num; // 入栈 top对应最新的数据 break; case '-': stack[++top] = -num; break; case '*': stack[top] *= num; // 和栈顶的元素作算法 break; case '/': stack[top] /= num; break; } // num 后的运算符 flag = data[i]; if (data[i] == '}' || data[i] == ']' || data[i] == ')') { i++; break; } i++; } int ret = 0; for (int j = 0; j <= top; j++) { ret += stack[j]; } return ret; }