大佬的递归解法,也可以称为消消乐解法,这是我见过最简洁的表达式求值代码。看到这种解法之后我都不想去看什么逆波兰了。。。首先声明,我只是个搬运工。
第一步,先考虑无括号的情况,先乘除后加减,这个用栈很容易解决,遇到数字先压栈,如果下一个是乘号或除号,先出栈,和下一个数进行乘除运算,再入栈,最后就能保证栈内所有数字都是加数,最后对所有加数求和即可。
第二步,遇到左括号,直接递归执行第一步即可,最后检测到右括号,返回括号内的计算结果,退出函数,这个结果作为一个加数,返回上一层入栈。
递归解法 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; }