四则运算,递归解法分析,最简洁的代码

四则运算

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

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

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

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

递归解法 c++版本:

#include <iostream>
#include <stack>

using namespace std;

int pos;

int compute(string & data)
{
    int len = data.length();
    int num = 0;
    char flag = '+';
    stack<int> st;

    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 '+':
            st.push(num);
            break;
        case '-':
            st.push(-num);
            break;
        case '*':
            {
                int temp = st.top();
                temp *= num;
                st.pop();
                st.push(temp);
                break;
            }
        case '/':
            {
                int temp = st.top();
                temp /= num;
                st.pop();
                st.push(temp);
                break;
            }
        }

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

    int sum = 0;
    while (st.size()) {
        sum += st.top();
        st.pop();
    }
    return sum;
}

int main()
{
    string data;

    while (cin >> data) {
        pos = 0;
        cout << compute(data) << endl;
    }
    return 0;
}

递归解法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;
}
全部评论
C语言版本 试了一下 有一个问题 负数不加括号的话 不能正常运算 例如:6+2*-2 输出结果不是2 尝试着改进了一下,代码如下 #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,flg = 1; 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++; } num *= flg; flg = 1; if(data[pos] == '-' && (flag == '*' || flag == '/') ) { flg = -1; } else { 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; }</ctype.h></string.h></stdio.h>
3 回复 分享
发布于 2021-03-31 00:02
大佬请问这句代码中num = num*10 + data[pos] -'0',num*10是什么意思
2 回复 分享
发布于 2021-06-15 11:33
秒啊
点赞 回复 分享
发布于 2021-04-15 15:13
就很优雅
点赞 回复 分享
发布于 2021-08-17 22:14
虽然萌新看不太懂,但大为震撼
点赞 回复 分享
发布于 2021-11-15 19:27
flag = data[pos]; 这一句最后会内存溢出吧
点赞 回复 分享
发布于 2022-09-28 18:20 湖南
看完代码我心中的只有敬畏
点赞 回复 分享
发布于 2023-01-05 14:49 江西

相关推荐

尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
48 17 评论
分享
牛客网
牛客企业服务