表达式求值学习笔记

算术表达式求值

题目描述

给出运算符只能为+ (加)、-(减)、*(乘)、/(整除)的算术表达式,操作数可以是一个正整数或者为一个用括号括起来的算术表达式。

给出一个算术表达式,求运算结果

输入样例

((((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大佬

原文地址:https://www.cnblogs.com/liujunxi/p/14369600.html