zoukankan      html  css  js  c++  java
  • 表达式求值 http://acm.nyist.net/JudgeOnline/problem.php?pid=305

     

    表达式求值

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

    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
    来源
    第四届河南省程序设计大赛
    #include<stdio.h>
    #include<string.h>
    char a[310],b[310];
    int d[310];
    
    int fun(int x,int y,char c)
    {
    	if(c=='d')
    		return x+y;
    	if(c=='i')
    		return x>y?y:x;
    	if(c=='a')
    		return x>y?x:y;
    }
    
    int main()
    {
    	int i,n;
    	int len,btop,dtop,sum;
    	scanf("%d",&n);
    	while(n--)
    	{
    		btop=1;
    		dtop=1;
    	/*	memset(b,0,size(b));
    		memset(d,0,size(d));*/
    		scanf("%s",a);
    		len=strlen(a);
    		for(i=0;i<len;)
    		{
    			if(a[i]=='('||a[i]==',')
    				i++;
    			else if(a[i]>='a'&&a[i]<='z')
    			{
    				i++;
    				b[btop++]=a[i];
    				i+=2;
    			/*	if(a[i]=='d')
    				{
    					b[btop++]=a[i];
    					i+=2;
    				}
    				 if(a[i]=='i')
    				{
    					b[btop++]=a[i];
    					i+=2;
    				}
    				 if(a[i]=='a')
    				{
    					b[btop++]=a[i];
    					i+=2;
    				}*/
    			}
    			else if(a[i]>='0'&&a[i]<='9')
    			{
    				sum=0;
    				while(a[i]>='0'&&a[i]<='9')
    				{
    					sum=sum*10+a[i]-'0';
    					i++;
    				}
    				d[dtop++]=sum;
    			}
    			else if(a[i]==')')
    			{
    				sum=fun(d[--dtop],d[--dtop],b[--btop]);
    				d[dtop++]=sum;
    				i++;
    			}
    		}
    		printf("%d
    ",d[1]);
    	}
    	return 0;
    }
    


    今天刚学的栈的应用。这题的思路是遍历整个数组,然后分类储存,栈是先进后出,然后碰到‘)’就运算一次,最后就是结果!

  • 相关阅读:
    on、where、having的区别(转载)
    Javascript 中的非空判断 undefined,null, NaN的区别
    SRM 223 Div II Level Two: BlackAndRed,O(N)复杂度
    ibatis通过Map封装参数调用存储过程
    NoSQL架构实践
    js实现密码强度验证
    ubuntu 10.04安装qtcreator并汉化
    2017第19周一
    越挫越战,越战越勇
    2017第18周六
  • 原文地址:https://www.cnblogs.com/wangyouxuan/p/3245465.html
Copyright © 2011-2022 走看看