nyoj1272 zzulioj1923表达式求值(河南省acm第九届省赛)

本文主要是介绍nyoj1272 zzulioj1923表达式求值(河南省acm第九届省赛),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

表达式求值

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
假设表达式定义为: 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≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000
输出
【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。
样例输入
3
12+2*3
12*(2+3)
12*(2+3)+Smax(333,220+280)
样例输出
18
60
69
来源
河南省第九届省赛
上传者
onlinejudge

和数据结构这本书上的表达式求值类似。

在这里只不过多了smax运算符。仔细分析后我们可以把smax的功能让,来实现。

主要就是处理好运算符的优先级即可~   根据数据结构上的优先级 很快可以找到本题的优先级



然后就是使用栈来模拟操作了、

遍历表达式,每次遇到数字就将这个数入数字栈,如果遇到运算符就和当前栈顶的运算符相比较 ,根据运算符优先级的不同来进行计算。

具体代码如下:

#include <stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char row[]={"+,*()#"};
//运算符优先级 
char mm[10][10]={">><<>>","<><<>>",">>><>>","<<<<=>",">>>=>>","<<<<<="};
//取得运算符所有的行号				 
int getRow(char c)
{for(int i=0;i<6;i++){if(c==row[i])return i;}
}
//获得优先级 
char getPiro(int x,int y)
{return mm[x][y];
}
//smax操作 
int mod(int n)
{int sum=0;while(n>0){sum+=n%10;n=n/10;}
//	printf("sum=%d \n",sum);return sum;} 
//根据不同的运算符 执行不同的操作 
int caculate(int a,int b,char threat)
{switch(threat){case '+': return a+b;case '-': return a-b;case '*': return a*b;case ',': return mod(a)>mod(b)?mod(a):mod(b);}
}
int main()
{char str[1050];int t;stack<int> num; stack<char> op;scanf("%d",&t);while(t--){op.push('#');scanf("%s",str);int len=strlen(str);str[len]='#';str[len+1]='\0';len++;int temp=0;bool in=false;for(int i=0;i<len;i++){    in=false;//如果遇到数字  一直执行到读取数字结束 while(str[i]>='0'&&str[i]<='9'&&i<len){temp=temp*10+str[i]-'0';i++;in=true;}if(in) num.push(temp),temp=0;//如果遇到运算符 就和当前栈顶的运算符相比较 if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='('||str[i]==')'||str[i]==','||str[i]=='#'){//	op.push(str[i]);bool exit=true;while(exit){switch(getPiro(getRow(op.top()),getRow(str[i]))) {case '<': op.push(str[i]),exit=false;break;case '=': op.pop(),exit=false;break;case '>': {char threat =op.top();op.pop();int a=num.top();num.pop();int b=num.top();num.pop();//    printf("%d %c %d\n",a,threat,b);num.push(caculate(a,b,threat));//计算a threat b break;}}}}}while(!op.empty()) op.pop();printf("%d\n",num.top());num.pop();}return 0; 
}



这篇关于nyoj1272 zzulioj1923表达式求值(河南省acm第九届省赛)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694630

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采