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

相关文章

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

SpringBoot @Scheduled Cron表达式使用方式

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有... 目录Cron 表达式详解1. 表达式格式‌2. 特殊字符解析3. 常用示例‌4. 重点规则5. 动态与复杂场景‌

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

使用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 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�