题解 | #四则运算#
四则运算
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;
}
查看2道真题和解析