nyoj 305 表达式求值 栈,递归(switch)和数组

表达式求值, 题目链接 ,click here.
时间限制: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
来源
第四届河南省程序设计大赛
上传者
张云聪

一个很简单的表达式求值.三种方法,我只是用递归写的,写法都一样,然后看了好多排行榜上的大神,真的是好厉害,接下来代码一一呈上:

第一个是用数组直接从前往后强力一波直接AC的:

#include<stdio.h>
#include<string.h>
char a[310];
int b[310],c[310];
int bijiao(int a,int b,char c)
{
    if(c=='a')
        return a>b?a:b;
    else if(c=='i')
        return a<b?a:b;
    else if(c=='d')
        return a+b;
}
int main()
{
    int s;
    scanf("%d",&s);
    while(s--)
    {
        int le,n,i,j,b1,c1;
        scanf("%s",a);
        le=strlen(a);
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        b1=c1=1;
        for(i=0; i<le;)
        {
            if(a[i]=='a'||a[i]=='m')
            {
                i++;
                if(a[i]=='a')
                    b[b1++]='a';
                else if(a[i]=='d')
                    b[b1++]='d';
                else if(a[i]=='i')
                    b[b1++]='i';
                i+=2;
            }
            else if(a[i]=='('||a[i]==',')
                i++;
            else if(a[i]>='0'&&a[i]<='9')
            {
                n=0;
                while(a[i]>='0'&&a[i]<='9')
                {
                    n=n*10+(a[i]-48);
                    i++;
                }
                c[c1++]=n;
            }
            else if(a[i]==')')
            {
                n=bijiao(c[--c1],c[--c1],b[--b1]);
                c[c1++]=n;
                i++;
            }
        }
        printf("%d\n",c[--c1]);
    }
    return 0;
}

这个是用指针实现的,大家可以了解揣摩一下.

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<iostream>
using namespace std;
char str[310],*s,*p;
int acm();
int get(){
    if(*s>='0' && *s<='9') return (int)strtod(s,&s);
    else return acm();
}
int acm(){
    int x,y;
    char ch1,ch2;
    ch1=*s++;ch2=*s++;s++;s++;
    x=get(); s++;
    y=get(); s++;
    if(ch1=='a') return x+y;
    if(ch2=='a') return max(x,y);
    return min(x,y);
}
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%s",str);
        s=str;
        printf("%d\n",get());
    }
}

接下来是递归:

#include<bits/stdc++.h>
using namespace std;
char a[10000];
int s;
int solve ()
{
    int n,v;
    switch(a[s])
    {
    case'm':
        s+=3; 
        if(a[s-2]=='i')
            return min(solve(),solve());
        else
            return max(solve(),solve());
    case 'a':
        s+=3;
        return solve()+solve();
    case '(':
    case')':
    case ',':
        s++; 
        return solve();
    default:
        sscanf(a+s,"%d%n",&v,&n);//从数组s位置起开始读入n位的数字v
        s+=n;//判断输入了几位数字
        return v;
    }
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",a);
        s=0;
        printf("%d\n",solve());
    }
    return 0;
}

总的来说收获不小,学的东西不少.

x1y2 x2y3 x3y1-x1y3-x2y1-x3y2 是计算三角形面积的公式中的一部分。 在这个公式中,x1、x2、x3分别表示三角形的三个顶点的x坐标,y1、y2、y3分别表示三角形的三个顶点的y坐标。通过计算这个表达式的值,可以得到三角形的面积。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [TetraCluster:使用并行Java 2库的Java并行程序。 该程序在群集并行计算机上运行,​​以从给定的点集中找到...](https://download.csdn.net/download/weixin_42171208/18283141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [线性代数有个题,求正交变换x=Qy,化二次型f(x1,x2,x3)=8x1x2+8x1x3+8x2x3为标准型求出特征值](https://blog.csdn.net/weixin_39956182/article/details/115882118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [nyoj-67-三角形面积(S=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2))](https://blog.csdn.net/weixin_30492601/article/details/99541033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值