题解 | #四则运算#

四则运算

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;
}

全部评论

相关推荐

05-13 02:01
已编辑
惠州学院 前端工程师
安静的少年在求佛:建议把公司名字写到标题。以后有人想搜就能直接搜到
点赞 评论 收藏
分享
06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务