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

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

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

递归解法 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;
}