算术表达式求值
题目描述
给出运算符只能为+ (加)、-(减)、*(乘)、/(整除)的算术表达式,操作数可以是一个正整数或者为一个用括号括起来的算术表达式。
给出一个算术表达式,求运算结果
输入样例
((((7-5+3)+1)*2-10)/2+3)+(2-3)
输出样例
3
考虑用递归求解,先求解括号里面的,再乘除,后加减,进行分治计算
啥也不说,上代码,代码写的很详细了
Code:
#include<bits/stdc++.h> using namespace std; char s[1002]; int l, r; int solve() { int ch = 1, k = 1, f = 1, res = 0, ans = 0; //ch : 上一个是乘还是除,1的话是乘过来的,0是除过来的,因为要先乘除后加减 //k : 乘除后的到的中间值, 用来满足先乘除后加减的定律 //f : 上一个是加还是减, 1的话是加过来的,0是减过来的 //res : 要用于计算的数字 //ans : 最终要返回的结果 while (s[l] != ')' && l < r) { if (s[l] == '(') l ++, res = solve(); //遇到左括号,左端点 ++,开始计算左端点开始的值 else if (s[l] >= '0' && s[l] <= '9') res = res * 10 + (s[l] - '0'); //遇到数字,记录下来 else if (s[l] == '+') (ch ? ans += k * f * res: ans += k * f / res), f = 1, ch = 1, k = 1, res = 0; //遇到加号,如果上次是(乘号/除号),ans加上上次(乘/除)出来的中间值(乘/除)现在算出来的值 //把f赋值为1,下次遇到这个值的时候记得加上 else if (s[l] == '-') (ch ? ans += k * f * res: ans += k * f / res), f = -1, ch = 1, k = 1, res = 0; //减同理,下次遇到记得减去即可 else if (s[l] == '*') ch ? k *= res : k /= res, res = 0, ch = 1; //如果 如果上次是(乘号/除号),k(乘/除)上现在算出来的值 //把ch赋值为1,下次计算的时候记得乘上 else if (s[l] == '/') ch ? k *= res : k /= res, res = 0, ch = 0; //同理,把ch赋值为1,下次计算的时候记得乘上 l ++; //左端点扩展一位 } ch ? ans += k * f * res : ans += k * f / res; //记得把乘除出来的值加上,前面由于优先级的原因可能没算 return ans; } int main() { scanf ("%s", s + 1); s[0] = '(', s[strlen(s)] = ')', r = strlen(s); //把算式的左右边赋值为左右括号,把r设成新算出来的长度 cout << solve() << endl; //输出算出来的值,完结撒花! return 0 ; }
参考@wjh大神的思路,感谢wjh大佬