• 第四届河南省程序设计大赛:表达式求值 (栈)


    http://nyoj.top/problem/305

    题目描述:

    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>
    #include <algorithm>
    #include <stack>
    using namespace std;
    #define N 550
    char str[N];
    int main()
    {
    	int n,i,len,sum,a,b,c;
    	scanf("%d", &n);
    	while(n--){
    		stack <int> A;
    		stack <int> B;
    		scanf("%s", str);
    		len=strlen(str);
    		for(i=0; i<len; i++){
    			if(str[i] == 'a'){
    				A.push(1);
    				i+=2;
    			}
    			else if(str[i] == 'm'){
    				if(str[i+1] == 'i')
    					A.push(2);
    				else
    					A.push(3);
    				i+=2;
    			}
    			else if(str[i] >= '0' && str[i] <= '9'){
    				sum=0;
    				for(; i<len; i++){
    					if(str[i] >= '0' && str[i] <= '9')
    						sum = sum*10 + str[i] - '0';
    					else
    						break;
    				}
    				i--;
    				B.push(sum);
    			} 
    			else if(str[i] == ')'){
    				a = A.top(); A.pop();
    				b = B.top(); B.pop();
    				c = B.top(); B.pop();
    				if(a == 1)
    					sum = b + c;
    				else if(a == 2)
    					sum = min(b , c);
    				else if(a == 3)
    					sum = max(b , c);
    				B.push(sum);
    			}		
    		}
    		printf("%d
    ", B.top());
    	}
    	return 0;
    }
  • 相关阅读:
    ubuntu正确输入用户名密码后重复登录界面
    Spring第一个程序
    winrar解压spring出现“路径和文件名总长度必须不能超过 260 个字符!”错误的解决方法
    Spring属性装配之属性类型是另外一个被装载的类
    classpath、path、JAVA_HOME的作用及JAVA环境变量配置
    ubuntu基本命令篇15系统管理time命令中Real,User,Sys概念
    基于linux使用mysql二进制包安装mysql5.5
    shell循环语法
    db笔记本
    shell function
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852758.html
Copyright © 2020-2023  润新知