title: 表达式求值 第九届省赛 nyoj 1272

tags: [栈,数据结构]

题目链接

描述

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

输入

【标准输入】 第一行: T 表示要计算的表达式个数 (1≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000

输出

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

样例输入

3

12+2*3

12*(2+3)

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

样例输出

18

60

69

分析:

跟普通的表达式求值得算法没有什么大的区别,也是把中缀表达式转换为后缀表达式,然后用后缀表达式来求解。吧Smax也看做一种与加减乘除一样的运算,而他的优先级是最大的。

代码:

#include<bits/stdc++.h>
using namespace std;
char in[1001];///中缀
char post[1001];///后缀
int pri[200];///优先级
bool isNum(char a)///判断是不是数字
{
if(a>='0'&&a<='9')
return true;
return false;
}
void zhuan()///中缀转后缀
{
stack<char>op;
op.push('=');
int k=0,k1=0;
for(int i=0; in[i]!='\0'; i++)
{ if(in[i]=='m'||in[i]=='a'||in[i]=='x')///'S'也当作一个运算符了,这样的话就不用处理他们了
continue;
if(isNum(in[i]))
{
post[k++]=in[i];
k1++;
}
else
{
if(k1!=0)///有数字的话,就把数字分割开
{
post[k++]=' ';
k1=0;
}
if(in[i]==',')continue;///跳过,不用处理
if(in[i]=='(')
op.push(in[i]);
else if(in[i]==')')
{
while(op.top()!='(')
{
post[k++]=op.top();
op.pop();
}
op.pop();
}
else
{
while(pri[op.top()]>=pri[in[i]])
{
post[k++]=op.top();
op.pop();
}
op.push(in[i]);
}
} }
while(op.top()!='=')
{
post[k++]=op.top();
op.pop();
}
post[k]='\0';
} int Smax(int a,int b)///定义Smax的运算
{
int suma=0;
while(a)
{
suma+=a%10;
a/=10;
}
int sumb=0;
while(b)
{
sumb+=b%10;
b/=10;
}
return max(suma,sumb);
} int result(int a,int b,char op)
{
switch(op)
{
case '+' :
return a+b;
case '-' :
return b-a;
case '*' :
return a*b;
case '/' :
return b/a;
case 'S' :
return Smax(a,b);
}
} int jisuan()
{
stack<int>num;
int sum=0;
for(int i=0; post[i]; i++)
{
if(isNum(post[i]))
sum=sum*10+post[i]-'0';
else
{
if(sum!=0)
{
num.push(sum);
sum=0;
}
if(post[i]!=' ')
{
int a=num.top();
num.pop();
int b=num.top();
num.pop();
num.push(result(a,b,post[i]));
}
}
}
return num.top();
} int main()
{
// freopen("2.txt","r",stdin);
///定义优先级,'S'表示的是Smax这个算法,优先级最大
pri['=']=0;
pri['(']=1;
pri['+']=2;
pri['-']=2;
pri['*']=3;
pri['/']=3;
pri['S']=4;
int t;
scanf("%d",&t);
while(t--)
{
memset(in,0,sizeof(in));
memset(post,0,sizeof(post));
scanf(" %s",in);
zhuan();
//puts(post);
printf("%d\n",jisuan());
} return 0;
}

NYOJ 1272 表达式求值 第九届省赛 (字符串处理)的更多相关文章

  1. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  2. nyoj 305 表达式求值 (递归)

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  3. NYOJ 305 表达式求值 (字符串处理)

    题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...

  4. NYOJ 35 表达式求值 (字符串处理)

    题目链接 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:&quo ...

  5. nyoj(表达式求值)

    描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2 ...

  6. NYOJ 35 表达式求值

    一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...

  7. NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏

    #include<iostream> #include<string> #include<stack> #include<cstdio> using n ...

  8. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

  9. 数据结构--栈的应用(表达式求值 nyoj 35)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...

随机推荐

  1. 爬虫学习之-sqlite3

    SQLlte数据类型 SQLite能保存什么样的数据类型 ?? 可以保存空值.整数.浮点数.字符串和blob. 什么是blob ?? 是二进制大对象.例如图片.音乐.zip文件. 什么是游标 ?? 游 ...

  2. IE 之 userData 模拟 localStorage

    引 chrome,  safari, firefox, ie 9都支持 localStorage.  但可恶的是,中国 ie 6 占有最大的比例. 使用 cookie 不但容量有限,而且给我们增加了不 ...

  3. SSH管理(重启 停止 运行 安装)centos7

    下面整理经常用到管理SSH服务的命令,方便复制哈. SSH服务状态 systemctl status sshd.service SSH运行命令 service sshd start SSH重启命令 s ...

  4. 转---秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  5. Django模板语言循环字典

    1. 对于字典,可以有下列用法: {% for row in user_dict.keys %} {% for row in user_dict.values %} {% for row in use ...

  6. 【比赛】HNOI2018 排列

    这题原题... 这题题面七绕八绕,有点麻烦,反正最后转化就是一棵树,每个点有一个值,要把所有点选完,要求选择一个点必须是它的父亲和祖先已经全部被选了,贡献是这个点的权值乘上它被选择的排名 如果一个点是 ...

  7. 【BZOJ3437】小P的牧场(动态规划,斜率优化)

    [BZOJ3437]小P的牧场(动态规划,斜率优化) 题面 BZOJ 题解 考虑暴力\(dp\),设\(f[i]\)表示强制在\(i\)处建立控制站的并控制\([1..i]\)的最小代价. 很显然,枚 ...

  8. [JOI 2015 Final] 分蛋糕 2

    link 试题分析 容易发现性质,选择的是一段区间,但是贪心无法去维护这件事情,所以考虑$dp$,且我们只要去设计关于$JOI$的选择. 设$dp(i,j)$为现在要在$[l,r]$区间内选择,然后就 ...

  9. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) F dfs序+树状数组

    Performance ReviewEmployee performance reviews are a necessary evil in any company. In a performance ...

  10. bzoj 4332: JSOI2012 分零食 快速傅立叶变换

    题目: Description 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\(f(x)=O*x^2+S*x+U\) 现 ...