• NYOJ 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

    分析:

    其实这个表达式计算就只涉及到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]!=''; i++)
        {
            //cout<<"i==="<<i<<endl;
            if(a[i]>='0'&&a[i]<='9')///b数组用来暂存一个操作数
            {
                b[k++]=a[i];
            }
            else
            {
                if(k!=0)///也就意味着当前操作数接收完毕
                {
                    b[k]='';
                    st1.push(atof(b));
                    memset(b,'',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
    ",st1.top());
        //st1.pop();
        //if(st1.empty()) 
        //cout<<"hhhhhhh"<<endl;
    }
    int main()
    {
        int n;
        char a[1009];
        scanf("%d",&n);
        while(n--)
        {
            memset(a,'',sizeof(a));
            scanf(" %s",a);
            if(a[0]>='0'&&a[0]<='9')///特殊情况,是有一个操作符,直接输出来就行
                cout<<a<<endl;
            else
            Trans(a);
        }
        return 0;
    }
  • 相关阅读:
    201671010424马玉琴实验四结对项目的互评
    201671010424马玉琴《 英文文本统计》 结对项目
    201671010424马玉琴实验二词频统计软件项目
    201671010424马玉琴 实验三作业互评与改进报告
    读构建之法后提问。
    201671010425邱世妍 团队评审&课程总结
    201671010425-邱世妍 第四次试验互评
    《英文文本统计分析》结对项目报告
    201671010425-邱世妍 词频统计软件项目报告
    201671010425-邱世妍 作业互评与改进报告
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6737481.html
Copyright © 2020-2023  润新知