【zzuli-1923】表达式求值

本文介绍了一种将中缀表达式转换为后缀表达式并求值的算法,包括自定义函数Smax的处理方法。该算法适用于含有特定数学运算及自定义函数的表达式求值问题。

【zzuli-1923】表达式求值

题目描述

假设表达式定义为:
1. 一个十进制的正整数 X 是一个表达式。
2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.
3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 
值的各位数字之和,再从中选最大数。
4.如果 X 是 表达式,则 (X)也是表达式。
例如: 
表达式 12*(2+3)+Smax(333,220+280) 的值为 69。
请你编程,对给定的表达式,输出其值。

输入

第一行: T 表示要计算的表达式个数 ($1 \le T \le 10$)
接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000

输出

对于每个表达式,输出一行,表示对应表达式的值。

样例输入

3
12+2*3
12*(2+3)
12*(2+3)+Smax(333,220+280) 

样例输出

18
60
69

1.将中缀表达式转化成后缀表达式。如果是整数直接输出,如果是运算符且比栈顶元素优先极高就压入栈顶,否则弹出栈顶运算符。其中左括号优先级最低,但是遇到无条件压栈,遇到右括号就将栈内的运算符弹出,直到遇到左括号,左右括号不输出;新定义运算规则Smax可以看做运算符为','。

2.将后缀表达式求值。将后缀表达式入栈,遇到运算符则弹出栈顶两个数进行运算,遇到新定义运算','特殊考虑一下即可。

 

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 string s;
  4 string houzhui[1004];
  5 map<char, int>M;
  6 int ret_num(string s)
  7 {
  8     int l = s.size(), sum = 0;
  9     for(int i = 0; i < l; i++)
 10     {
 11         if(s[i] >= '0' && s[i] <= '9')
 12             sum = sum*10+s[i]-'0';
 13         else return -1;
 14     }
 15     return sum;
 16 }
 17 int Bit(int n)
 18 {
 19     int sum = 0;
 20     while(n)
 21     {
 22         sum += n%10;
 23         n /= 10;
 24     }
 25     return sum;
 26 }
 27 int main()
 28 {
 29     int n;
 30     stringstream ss;
 31     string s1;
 32     cin>>n;
 33     M['('] = 0, M[','] = 1, M['+'] = 2, M['*'] = 3;
 34     while(n--)
 35     {
 36         cin>>s;
 37         stack<char>S;
 38         int l = s.size(), c = 0, num = 0;
 39         for(int i = 0; i < l; i++)
 40         {
 41             if(s[i] == 'S' || s[i] == 'm' || s[i] == 'a' || s[i] == 'x') continue;
 42             if(s[i] >= '0' && s[i] <= '9') num = num*10+s[i]-'0';
 43             else
 44             {
 45                 if(num != 0)//两运算符相邻的情况
 46                 {
 47                     ss.clear();
 48                     ss<<num, ss>>s1;
 49                     houzhui[c++] = s1;
 50                     num = 0;
 51                 }
 52  
 53                 if(s[i] == '(') S.push(s[i]);
 54                 else if(s[i] == ')')
 55                 {
 56                     while(S.top() != '(')
 57                     {
 58                         houzhui[c++] = S.top();
 59                         S.pop();
 60                     }
 61                     S.pop();
 62                 }
 63                 else
 64                 {
 65                     while(!S.empty() && M[S.top()] >= M[s[i]])
 66                     {
 67                         houzhui[c++] = S.top();
 68                         S.pop();
 69                     }
 70                     S.push(s[i]);
 71                 }
 72             }
 73         }
 74         ss.clear();
 75         if(num != 0)
 76         {
 77             ss<<num, ss>>s1;
 78             houzhui[c++] = s1;
 79         }
 80         while(!S.empty())
 81         {
 82             houzhui[c++] = S.top();
 83             S.pop();
 84         }
 85         stack<int>S1;
 86         for(int i = 0; i < c; i++)
 87         {
 88             num = ret_num(houzhui[i]);//判断是否是整数若是返回其值,不是返回-1(数不可能为负)
 89             if(num != -1) S1.push(num);
 90             else
 91             {
 92                 int n2 = S1.top();
 93                 S1.pop();
 94                 int n1 = S1.top();
 95                 S1.pop();
 96                 if(houzhui[i] == "+") S1.push(n1+n2);
 97                 else if(houzhui[i] == "*") S1.push(n1*n2);
 98                 else
 99                 {
100                     int bit1 = Bit(n1);
101                     int bit2 = Bit(n2);
102                     S1.push(max(bit1, bit2));
103                 }
104             }
105         }
106         printf("%d\n", S1.top());
107     }
108     return 0;
109 }

 

posted @ 2018-05-02 14:33 LesRoad 阅读(...) 评论(...) 编辑 收藏

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值