【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位正整数的简单算术运算(只考虑整数运 ...
随机推荐
- CentOS 6.5上安装python2.7、pip以及Python命令行补全和yum冲突解决
目前CentOS6.5上自带的python版本为2.6,升级到python2.7会碰到很多问题.本文将介绍如何安装python2.7.pip以及python命令行补全. 一.如何安装python2.7 ...
- SQL学习笔记之B+树
0x00 概述 要描述清楚B+树,得先了解二叉查找数,平衡二叉树. 0x01 二叉查找树 任意节点,它的左子树如果不为空,那么左子树上所有节点的值都小于根节点的值:任意节点,他的右子树如果不为空,那么 ...
- Django学习笔记之Queryset详解
Django ORM用到三个类:Manager.QuerySet.Model.Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己 ...
- Linux各目录缩写含义
Unix已经有35年历史了.许多人认为它开始于中世纪,这个中世纪是相对于计算机技术的产生和发展来说的.在过去的时间里,Unix和它的子分支Linux收集有许多的历史和一些完全古老的语言.在这篇技巧文章 ...
- 20145324 《Java程序设计》第6周学习总结
20145324 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 1.使用输入串流将数据从来源取出 InputStream 使用输出串流将数据写入目的地 OutStream ...
- 20145328 《Java程序设计》第8周学习总结
20145328 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),re ...
- SVN添加忽略目录
项目:Thinkphp 目录结构: Thinkphp |-- Common |-- Runtime |-- Home 忽略目标: Runtime 文件夹及下面所有文件 首先,需要忽略的目录必须没有加入 ...
- GCC精彩之旅
在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器.目前Linux下最常用的C语言编译器是GCC(GNU Compile ...
- Idea 切换git账号
重置一下账号设置,再次执行拉取或推送会提示重新输入账号密码 进入项目根目录执行:git config --system --unset credential.helper
- selenium webdriver模拟鼠标键盘
在测试使用Selenium webdriver测试WEB系统的时候,用到了模拟鼠标.键盘的一些输入操作. 1.鼠标的左键点击.双击.拖拽.右键点击等: 2.键盘的回车.回退.空格.ctrl.alt.s ...