zoukankan      html  css  js  c++  java
  • 表达式求值学习笔记

    算术表达式求值

    题目描述

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

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

    输入样例

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

  • 相关阅读:
    Dubbo与Eureka
    对称加密与非对称加密
    [转] SpringBoot2.0集成WebSocket,实现后台向前端推送信息
    [转] Druid简介(Spring Boot + Mybatis + Druid数据源【自己定制】)
    [转] rsync+inotify实现文件实时同步
    [转] windows server 几大实时同步软件比较
    [转] Springboot 整合RabbitMq ,用心看完这一篇就够了
    [转] Windows环境下部署RabbitMQ
    [转] 分布式缓存 Redis 集群搭建
    [转] 吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
  • 原文地址:https://www.cnblogs.com/liujunxi/p/14369600.html
Copyright © 2011-2022 走看看