题目链接

描述

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

假设表达式可以简单定义为:

1. 一个正的十进制数 x 是一个表达式。

2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。

3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。

4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。

例如, 表达式 max(add(1,2),7) 的值为 7。

请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。

  • 输入

    第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10) 接下来有N行, 每行是一个字符串,表示待求值的表达式(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不超过1000。)
  • 输出

    输出有N行,每一行对应一个表达式的值。
  • 样例输入

    3

    add(1,2)

    max(1,999)

    add(min(1,1000),add(100,99))
  • 样例输出

    3

    999

    200

分析:

其实这个表达式计算就只涉及到max、min、add三种计算方法,但是他们的操作符都是一个字符串,而不是一个单独的字符,这就给我们对于操作符的识别带来了难度,但是我们可以发现对于这三个操作符来说呢,最后一位都是不一样的,所以可以用最后一位来表示这个操作符。

在计算的过程中呢定义一个操作数栈,一个操作符栈,每次遇见操作符的话就将最后一位进操作符栈,遇见操作数进操作数栈,遇见')'的话,就取一个操作符与两个操作数进行运算,再将运算结果进操作数栈。

但是有一种比较特殊的情况,就是说这个表达式只有一个单独的操作数,直接数出来就行了,因为这个错了半天。

代码:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<stack>
using namespace std;
long long int ji(char sd,long long int m,long long int n)
{
char x='d',y='x',z='n';
if(sd==x) return (m+n);
if(sd==y) return m>n?m:n;
if(sd==z) return m<n?m:n;
}
void Trans(char a[])
{
stack<long long int>st1;
stack<char>st2;
char b[100];
int k=0;
for(int i=0; a[i]!='\0'; i++)
{
//cout<<"i==="<<i<<endl;
if(a[i]>='0'&&a[i]<='9')///b数组用来暂存一个操作数
{
b[k++]=a[i];
}
else
{
if(k!=0)///也就意味着当前操作数接收完毕
{
b[k]='\0';
st1.push(atof(b));
memset(b,'\0',sizeof(b));
k=0;
}
if(a[i]>='a'&&a[i]<='z')///如果是操作符的话,就将操作符的最后一位进栈,然后后面的三位就不用管了
{
st2.push(a[i+2]);
i+=3;
}
else if(a[i]==')')///取两个操作数,一个操作符进行计算,再将计算的结果进栈
{
long long int n1=st1.top();
st1.pop();
long long int n2=st1.top();
st1.pop();
char ch=st2.top();
st2.pop();
long long int n3=ji(ch,n1,n2);
st1.push(n3);
///cout<<"n1=="<<n1<<" n2=="<<n2<<" ch==="<<ch<<" n3=="<<n3<<endl;
}
}
}
printf("%lld\n",st1.top());
//st1.pop();
//if(st1.empty())
//cout<<"hhhhhhh"<<endl;
}
int main()
{
int n;
char a[1009];
scanf("%d",&n);
while(n--)
{
memset(a,'\0',sizeof(a));
scanf(" %s",a);
if(a[0]>='0'&&a[0]<='9')///特殊情况,是有一个操作符,直接输出来就行
cout<<a<<endl;
else
Trans(a);
}
return 0;
}

NYOJ 305 表达式求值 (字符串处理)的更多相关文章

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

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

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

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

  3. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  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. 数据结构--栈的应用(表达式求值 nyoj 35)

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

  9. CF552E 字符串 表达式求值

    http://codeforces.com/contest/552/problem/E E. Vanya and Brackets time limit per test 1 second memor ...

随机推荐

  1. maven 实践 :管理依赖

    有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打包,发布...),但Maven给人造成这种错误的印象也是有原因的 ...

  2. SpringMVC 应知应会

    springMVC 是表现层技术,可以用来代替 struts2,下面是简略图:主要是处理器和视图,只有这两个部分需要编写代码. springMVC 三大组件:处理器映射器,处理器适配器,视图解析器. ...

  3. socket与TCP/UDP编程~

    ket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. ...

  4. iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转

    iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转 1. 字典转Json字符串 // 字典转json字符串方法 -(NSString *)convertToJs ...

  5. linux-----遇到的问题----tab键不补全sh文件不能运行

    在linux上部署tomcat,进入bin目录后 遇到了tab键不补全sh文件不能运行的情况. 如果自己输入sh文件名后也会报错: [x@web bin]$ ./startup.shbash: ./s ...

  6. Codeforces 894.D Ralph And His Tour in Binary Country

    D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...

  7. springMVC和mybatis的原理

    mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入和输出的映射,需要程序员自己写sql语句,my ...

  8. u3d摄像机截图

    using System; using UnityEngine; using System.Collections; public class TestCamreaCapture1 : MonoBeh ...

  9. ubuntu系统安装mysql二进制压缩包(tar.gz)以及navicat远程连接服务器(linux系统)

    一.ubuntu安装mysql5.6二进制压缩包(tar.gz) 准备 0. 获取 mysql-5.5.15-linux2.6-i686.tar.gz 二进制安装文件 mysql 官网下载页面选择 L ...

  10. Bootstrap 按钮组

    连在一起的按钮:.btn-group <div class="btn-group" role="group"> <button class=& ...