题解 | #四则运算#

四则运算

http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

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


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务