题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
#include <complex.h> #include <stdint.h> #include <stdio.h> #include <string.h> char *p; int caculate(char *exp) { int stack[1001]; int top = -1; //栈顶 char opr='i'; p = exp; while(*p!='\0') { int num=0; if(*p=='-') { opr='-'; p++; } while(*p>='0' && *p<='9') //处理数字 { num = num*10 + (int)(*p-'0'); p++; } //遇到左括号 把剩下的字符当初新的表达式进行递归 直到右括号返回 if(*p == '(' || *p == '[' || *p == '{') { //得到括号内的值 即把括号看成一个整体 p++; num = caculate(p); //这就是为什么指针p要定义为全局的 便于后续递归操作的回传 } switch(opr) { case '+': stack[++top]=num; break; //优先级低的进栈 case '-': stack[++top]=-num;break; case '*': stack[top]*=num; break; //优先级高的先计算再进栈 case '/': stack[top]/=num; break; case 'i': stack[++top]=num; break; //第一个数字是正数则直接进栈 } opr = *p; //前面已经处理了数字和左括号 所以这里*p必是符号 if(*p == ')' || *p == ']' || *p == '}') { p++; break; //中断当前循环 递归回溯 } p++; //循环继续 } int sum=0; //表达式内只剩下加法 for(int j=0;j<=top;j++) { sum += stack[j]; } return sum; } int main() { char exp[1001]; while (scanf("%s", exp) != EOF) { printf("%d",caculate(exp)); } return 0; }