zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    November 13th 2016 Week 47th Sunday The 1st Day
    November 12th 2016 Week 46th Saturday
    November 11th 2016 Week 46th Friday
    November 10th 2016 Week 46th Thursday
    November 9th 2016 Week 46th Wednesday
    November 8th 2016 Week 46th Tuesday
    windows 7文件共享方法
    Win7无线网络共享设置方法
    常量指针和指针常量
    如何查找局域网的外网ip
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6737481.html
Copyright © 2011-2022 走看看