【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.将后缀表达式求值。将后缀表达式入栈,遇到运算符则弹出栈顶两个数进行运算,遇到新定义运算','特殊考虑一下即可。
#include <bits/stdc++.h>
using namespace std;
string s;
string houzhui[];
map<char, int>M;
int ret_num(string s)
{
int l = s.size(), sum = ;
for(int i = ; i < l; i++)
{
if(s[i] >= '' && s[i] <= '')
sum = sum*+s[i]-'';
else return -;
}
return sum;
}
int Bit(int n)
{
int sum = ;
while(n)
{
sum += n%;
n /= ;
}
return sum;
}
int main()
{
int n;
stringstream ss;
string s1;
cin>>n;
M['('] = , M[','] = , M['+'] = , M['*'] = ;
while(n--)
{
cin>>s;
stack<char>S;
int l = s.size(), c = , num = ;
for(int i = ; i < l; i++)
{
if(s[i] == 'S' || s[i] == 'm' || s[i] == 'a' || s[i] == 'x') continue;
if(s[i] >= '' && s[i] <= '') num = num*+s[i]-'';
else
{
if(num != )//两运算符相邻的情况
{
ss.clear();
ss<<num, ss>>s1;
houzhui[c++] = s1;
num = ;
} if(s[i] == '(') S.push(s[i]);
else if(s[i] == ')')
{
while(S.top() != '(')
{
houzhui[c++] = S.top();
S.pop();
}
S.pop();
}
else
{
while(!S.empty() && M[S.top()] >= M[s[i]])
{
houzhui[c++] = S.top();
S.pop();
}
S.push(s[i]);
}
}
}
ss.clear();
if(num != )
{
ss<<num, ss>>s1;
houzhui[c++] = s1;
}
while(!S.empty())
{
houzhui[c++] = S.top();
S.pop();
}
stack<int>S1;
for(int i = ; i < c; i++)
{
num = ret_num(houzhui[i]);//判断是否是整数若是返回其值,不是返回-1(数不可能为负)
if(num != -) S1.push(num);
else
{
int n2 = S1.top();
S1.pop();
int n1 = S1.top();
S1.pop();
if(houzhui[i] == "+") S1.push(n1+n2);
else if(houzhui[i] == "*") S1.push(n1*n2);
else
{
int bit1 = Bit(n1);
int bit2 = Bit(n2);
S1.push(max(bit1, bit2));
}
}
}
printf("%d\n", S1.top());
}
return ;
}
【zzuli-1923】表达式求值的更多相关文章
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...
- HNU 12817 Shipura(表达式求值)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12817 解题报告:定义两种运算符号,一种是>>,就 ...
- NOIP201302表达式求值
NOIP201302表达式求值 题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计 ...
- OpenJudge计算概论-简单算术表达式求值
/*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...
随机推荐
- 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) B - Bribing Eve
地址:http://codeforces.com/gym/101174/attachments 题目:pdf,略 思路: 把每个人的(x1,x2)抽象成点(xi,yi). 当1号比i号排名高时有==& ...
- 【1】Kali Linux的安装及配置
爱生活就得够GEEK. ---------------------------------------------------------------完美的分割线------------------- ...
- 3.1、Ubuntu系统中jmeter的安装和目录解析
以下内容亲测,如果不对的地方,欢迎留言指正,不甚感激.^_^祝工作愉快^_^ Jmeter是一个非常好用的压力测试工具. Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测 ...
- The type javax.http.HttpServletRequest cannot be resolved.It is indirectly 解决办法
原因:项目中缺少servlet-api.jar文件. 解决办法:将E:\tomcat\apache-tomcat-6.0.24\lib下的servlet-api.jar拷贝到项目中,然后编译即可.(根 ...
- Swoole学习(三)Swoole之UDP服务器的创建
环境:Centos6.4,PHP环境:PHP7 <?php //创建UCP服务器(UDP服务器相对于TCP服务器通信更可靠些) /** * $host 是swoole需要监听的ip,如果要监听本 ...
- java语言学习笔记1
最近也在春节的节假日里,总是会有各种各样的事情出现,没有很完整的时间来学习java以及其他方面的知识. 从昨天开始有了完整的学习体系,我去娄老师推荐的极客学院网站开始学习java语言的语法.在假期之初 ...
- 20145211《网络渗透》Adobe阅读器渗透攻击
20145211<网络渗透>Adobe阅读器渗透攻击 实验准备 1.用了一个kali,一个English Winxp3,并保证能相互ping通 2.开启显示隐藏文件 实验步骤: 1.开启m ...
- C++DFS方法全排列
前几天看纪磊的<啊哈!算法>一书,里面讲算法讲的特别通俗细致,真的是初中生都能读得懂的算法书(我大二才读:P).这段代码很适合初学算法的同学. #include<iostream&g ...
- Chrome好用的插件:WhatRuns 查看网站使用的技术
Chrome好用的插件:WhatRuns 查看网站使用的技术 这是一款免费的Chrome扩展程序,使用很简单. chrome安装这个插件之后,打开要检测的网站,然后点击WhatRuns 的图标,就开始 ...
- Python学习札记(十四) Function4 递归函数 & Hanoi Tower
reference:递归函数 Note 1.在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. eg.计算阶乘: #!/usr/bin/env python3 def ...