zoukankan      html  css  js  c++  java
  • 【NYOJ-35】表达式求值——简单栈练习

    表达式求值

    时间限制: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
    【代码】
      
     1 #include<iostream>
     2 #include<string.h>
     3 #include<stdio.h>
     4 #include<stdlib.h>
     5 #include<stack>
     6 using namespace std;
     7 
     8 stack<int> s;
     9 
    10 int min(int p,int q){
    11 //    if(p > q) return q;
    12 //    else return p;
    13     return p >= q ? q : p;
    14 }
    15 
    16 int max(int p,int q){
    17 //    if(p > q) return p;
    18 //    else return q;
    19     return p >= q ? p : q;
    20 }
    21 
    22 int add(int p,int q){
    23     return p+q;
    24 }
    25 
    26 void reverse(char a[]){
    27     char b[405];
    28     memset(b,0,sizeof(b));
    29     strcpy(b,a);
    30     for(int i = 0;i < strlen(a);i++)
    31         a[i] = b[strlen(b)-i-1];
    32 }
    33 int main(){
    34     int n;
    35     char a[305],str[305];
    36     scanf("%d",&n);
    37     getchar();
    38     while(n--){
    39         int k = 0,ex = 0;
    40         gets(a);
    41         memset(str,0,sizeof(str));
    42         if(a[strlen(a)-1] != ')'){
    43             printf("%s
    ",a);
    44             continue;
    45         }
    46         for(int i = strlen(a) - 1; i >= 3;i--){
    47             if(a[i] == ')') continue;
    48             if(a[i] != ',' && a[i] != '(') str[k++] = a[i];
    49             if(a[i-1] == ',' || a[i-1] == '('){
    50                 reverse(str);
    51                 ex = atof(str);
    52                 k = 0;
    53                 memset(str,0,sizeof(str));
    54                 s.push(ex);
    55             }    
    56             if(a[i] == '('){
    57                 int p,q; //获得栈中数据
    58                 p = s.top(); s.pop();
    59                 q = s.top(); s.pop();
    60                 switch(a[i-1]){
    61                     case 'd': s.push(add(p,q)); i-=3; continue;
    62                     case 'n': s.push(min(p,q)); i-=3; continue;
    63                     case 'x': s.push(max(p,q)); i-=3; continue;
    64                 }
    65             }
    66         }
    67         printf("%d
    ",s.top());
    68     }
    69     return 0;
    70 }

    【总结】

      字符串转为双精度数值:

    1 //语法:
    2  #include <stdlib.h>
    3  double atof( const char *str );
    4 //功能:将字符串str转换成一个双精度数值并返回结果。参数str必须以有效数字开头,但是允许以“E”或“e”除外的任意非数字字符结尾。例如:
    5 //x = atof( "42.0is_the_answer" );
    6 //x的值为42.0.

      const:

        关键字const用来告诉编译器一个一旦被初始化过的变量就不能再修改

        const int a=5; 与 int const a=5; 等同

        类名 const 对象名 与 const 类名 对象名 等同

      

  • 相关阅读:
    SP是什么?CP是什么?SP与CP有什么区别?
    SP与CP将走向互补融合
    SP与CP分工
    Asynchronous Socket 顺序
    Asynchronous Client Socket Example
    Synchronous Server Socket Example
    web应用程序根目录
    简单socket服务(一)
    Asynchronous Server Socket Example
    Socket连接不上的问题
  • 原文地址:https://www.cnblogs.com/zhengbin/p/4347054.html
Copyright © 2011-2022 走看看