题解 | #四则运算#

杨辉三角的变形

http://www.nowcoder.com/practice/8ef655edf42d4e08b44be4d777edbf43

方法1:c
四则运算,递归解法分析,最简洁的代码
大佬的递归解法,也可以称为消消乐解法,这是我见过最简洁的表达式求值代码。看到这种解法之后我都不想去看什么逆波兰了。。。首先声明,我只是个搬运工。

第一步,先考虑无括号的情况,先乘除后加减,这个用栈很容易解决,遇到数字先压栈,如果下一个是乘号或除号,先出栈,和下一个数进行乘除运算,再入栈,最后就能保证栈内所有数字都是加数,最后对所有加数求和即可。

第二步,遇到左括号,直接递归执行第一步即可,最后检测到右括号,返回括号内的计算结果,退出函数,这个结果作为一个加数,返回上一层入栈。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int pos;

int compute(char* data)
{
    int len = strlen(data);
    int stack[1000];
    int top = -1;
    int num = 0;
    char flag = '+';

    while (pos < len) {
        if (data[pos] == '{' || data[pos] == '[' || data[pos] == '(') {
            pos++;
            num=compute(data);
        }

        while (pos < len && isdigit(data[pos])) {
            num = num*10 + data[pos] -'0';
            pos++;
        }

        switch (flag) {
        case '+':
            stack[++top] = num;
            break;
        case '-':
            stack[++top] = -num;
            break;
        case '*':
            stack[top] *= num;
            break;
        case '/':
            stack[top] /= num;
            break;
        }

        num = 0;
        flag = data[pos];
        if (data[pos] == '}' || data[pos] == ']'|| data[pos] == ')') {
            pos++;
            break;
        }
        pos++;
    }

    int res = 0;

    for (int i = 0; i <= top; i++) {
        res += stack[i];
    }
    return res;
}

int main()
{
    char data[1000];

    while (scanf("%s", data) != EOF) {
        pos = 0;
        int res = compute(data);
        printf("%d\n", res);
    }
    return 0;
}

方法2:python

while True:     
    try:         
        s=input()         
        print(eval(s))     
    except:         
        break 
全部评论

相关推荐

寿命齿轮:实习就一段还拉了,项目一看就不是手搓,学历也拉了,技术栈看着倒是挺好,就是不知道面试表现能咋样。 不过现在才大三,争取搞两端大厂实习,或者一个纯个人项目+一段大厂,感觉秋招还是未来可期。
投递美团等公司10个岗位
点赞 评论 收藏
分享
铁锈不腻玩家:下面那个袁先生删了,问他怎么回事,头像都换不明白
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务