nyoj ACM:表达式求值 (堆栈)

表达式求值(c语言实现--基于栈) 数据结构的高级运用,主要是栈的运用!这个是清华大学数据结构书上的题,将算法改成了c函数,或许对你有点用!调试过的运用程序也在,其中有点小问题希望高人指点! 立即下载

表达式求值
时间限制: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行,每一行对应一个表达式的值。

思路 :
对于表达式操作,首先要考虑的是用 堆栈!
题目的最优代码依然使用递归来处理的!

  1. 由于没有负数,所有定义整数型堆栈A,用所以令-1表示字符串”max” ,-2表示字符串”min”,-3表示”(“,//-4表示add
  2. 将字符串读入字符数组s中
  3. 从s[0]到s[strlen(s)-1],依次访问
    • 如果s[j] 是’a’ ,那么表明遇到了add , 则A.push(-4) , j=j+2 ,即从add中的a跳到了第二个d
    • 如果s[j] 是’m’且s[j+1]==’a’ ,那么表明遇到了max , 则A.push(-1) , j=j+2 ,
    • 如果s[j] 是’m’且s[j+1]==’i’ ,那么表明遇到了min , 则A.push(-2) , j=j+2 ,
    • 如果s[j] 是’(’ , 则A.push(-3)
    • 如果s[j] 是’,’ , 则直接忽略
    • 如果s[j] 是’)’ , 则A pop 两个数,再pop一个-3即”(” ,再pop的是运算符,运算完后将结果压入A中
    • s[j]上面都不是,那就说明是数字,这时就要注意数字不一定是各位数了。
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int main()
{
    int N;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        char s[600];
        scanf("%s",s);
        stack<int> A;//由于没有负数,所以令-1表示字符串"max" ,-2表示字符串"min",-3表示"("
        int l=strlen(s);
        for(int j=0;j<l;j++)
        {
            if(s[j]=='a') //-4表示add
            {
                A.push(-4);
                j=j+2;
                continue;
            }
            if(s[j]=='m'&&s[j+1]=='a')
            {
                A.push(-1);
                j=j+2;//for还会加一个1 
                continue;
            }
            else if(s[j]=='m'&&s[j+1]=='i')
            {
                A.push(-2);
                j=j+2;//for还会加一个1
                continue;
            }
            else if(s[j]=='(')
            {
                A.push(-3);
                continue;
            }
            else if(s[j]==',')
            {
                continue;
            }
            else if(s[j]==')')
            {
                int B=A.top();
                A.pop();
                int C=A.top();
                A.pop();
                int D=A.top();
                A.pop();
                int E=A.top();
                A.pop();
                if(E==-1)
                    A.push(max(B,C));
                else if(E==-2)
                    A.push(min(B,C));
                else if(E=-4)
                    A.push(B+C);

                continue;
            }
            int y=s[j];
            int x=0;;
            while(y>='0' && y<='9')
            {
                j++;
                x=x*10+(y-'0');
                y=s[j];
            }
            j--;
            A.push(x);

        }
        printf("%d\n",A.top());
        A.pop();
    }
    return 0;
}

最优代码:
用递归实现,以后有时间再来研究


#include<cstdio>
#include<iostream>
using namespace std;
char str[1000];
int start;
int val()
{
    int v,n;
    switch(str[start])
    {
    case 'm':start+=3;if(str[start-2]=='i') return min(val(),val());else return max(val(),val());
    case 'a':start+=3;return val()+val();
    case ')':
    case '(':
    case ',':++start;return val();
    default:sscanf(str+start,"%d%n",&v,&n);start+=n;return v;
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",str);
        start=0;
        printf("%d\n",val());
    }
}        
光谱数据预处理综合 除了化学信息,光谱还包含其他不相关或不需要的信息,如电噪声,基质背景,杂散光,散射效应等。在用化学计量学方法建立校准模型时,利用预处理方法消除光谱数据中的无关信息和噪声是非常必要的。 阅读详情

相关推荐

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

NYOJ 305 表达式求值

输入 第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10) 接下来有N行, 每行是一个字符串,表示待求值的表达式 (表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不 超过1000。) 输出 输出有N行,每一行对应一个表达式的值。 样例输入 3 add(1,2) max(1,999) add(min(1,1000),add(100,99)) 样例输出 3 999 ...

G191018的博客 256

基于osgEarth的二维态势中时变对象的绘制方法

在态势系统中,卫星、飞机的轨迹、覆盖等的几何数据随时间改变,称之为时变对象。在以OSGEarth实现的二维态势中,如果利用OSGEarth的预定义线、面类型处理这种几何数据的动态改变,则导致效率极具降低。介绍了此问题并给出解决技巧。

eyepeak的博客 2090

【OJ】表达式求值(加减乘除和括号)简化版

编写目的 刷OJ题的总结,也作为《数据结构》重新学习的笔记,用到了C++的标准库,因此可以简化一些操作。 题目描述 对简单的算术表达式求值。运算符包括+,-,*,/,(,),#。参加运算的数均为整数。 特别说明: 1)实验课请按照数据结构(C语言版)p53页算法3.4直接进行改编。 2)要实现算法3.4,还需要编写的函数如下:初始化栈函数--InitStack()函数,入栈函数--Push()函数...

Smileyan's blog 1万+

FreeCAD MCP实战:用自然语言驱动AI建模,效率提升10倍

MCP(Model Context Protocol)是一种让AI模型调用外部工具和数据的协议标准,通过标准化通信层解决AI与CAD软件之间的交互难题。其原理是向AI暴露工具清单,AI根据自然语言需求自动选择工具并填充参数。在工程实践中,这一技术显著降低了CAD建模门槛,将重复性操作从手动点击转为语音指令,适用于批量零件生成、参数化设计等场景。FreeCAD作为开源CAD,凭借开放的Python API和脚本化能力,成为落地MCP的理想平台。本文基于FreeCAD MCP的实操经验,分享环境搭建、自然语言建

weixin_31188927的博客 324

GEE开发之Landsat8计算MNDWI和数据分析

上一篇博客介绍了landsat8计算NDWI以及数据的获取,这次介绍MNDWI(改进的归一化差异水体指数)。

等待着冬天的风的博客 8440

ACM算法训练【模拟栈,表达式求值】

实际应该先计算1+2。应该用什么数据结构:当然是栈。很简单的题,代码奉上。

大河之犬的博客 494

starrc: LEF DEF FLOW与full chip flat netlist

SIKP_CELLS默认为"SKIP_CELLS: *"意思是跳过所有ref cell内部的rc提取,仅提取cell之间的互联线的rc,"SKIP_CELLS: *!与MACRO_DEF_FILE搭配使用的还有SKIP_CELLS命令,如果想提取block的寄生参数生成full chip的flat netlist,或者跳过block取执行hier的寄生参数提取都需要用到SKIP_CELLS。此时,macroA和macroB没有被跳过,所以提取其内部的rc,spef中存在两个A和两个B。

m0_61544122的博客 553

东华OJ 基础题83 表达式求值-难度易

依次输出从标准输入设备中读入的每一组测试数据对应的结果,输出一行,输出该表达式的值。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。标准输入设备中有多组测试数据,每组输入数据由一行组成,输入仅有整数和加减(正负)号构成的表达式(但是表达式可以插入空格)。以字符串形式输入仅有整数和加减(正负)号构成的表达式,输出该表达式的值。虽然OJ上是易,但是还是有点难度的。😋欢迎大伙私信或者评论区交流讨论😋。

laole_ye的博客 667

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 127

Windows版TASSEL5的下载及安装

TASSEL5是一款用于研究表型和基因型关系的软件,由美国康奈尔大学Buckler实验室所研发。,选择Windows环境安装包下载并安装。1.安装成功后TASSEL5界面。

沉香best的博客 8188

ACM,表达式求值、函数表达式求值,ACM表达式求值

观察函数每一个都是二元函数f(x,y)的形式。我们先解决这种没有嵌套,例如add(x,y)表示的是x+y,这不是蛮简单的吗?但是呢add(x,y)是一个字符串表达式(我们用str来表示),无法直接返回这个x+y的值。于是写两个函数来获取这个表达式的第一个参数和第二个参数的值getexp1(str)和getexp2(str),它们分别返回了这个表达str的1 2个参数的值。于是这个表达式的结果为add=getexp1(str)+getexp2(str) sub=getexp1(str)-getexp2(s

这是一条不归路 1677

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

nyoj 表达式求值集合

nyoj 栈 表达式求值

逝去的时光 646

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

nyoj ACM:前缀式计算( 堆栈的使用 或 递归 )

前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式:如2+(3+4)*5这种我们最常见的式子就是中缀式。而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )把括号去掉就是:+ 2 * + 3 4 5最后这个式子就是该表达式的前缀表示。给你一个前缀表达式,请你计

丁磊_ml的博客 917

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构(C++实现):栈的运用--中缀表达式转换为后缀表达式既 nyoj 257

这题用了c++提供的封装了,没有写手工栈,手工栈的代码等实验结束后再上传。        题目链接http://acm.nyist.net/JudgeOnline/problem.php?pid=257                                                    郁闷的C小加(一) 描述 我们熟悉的表达式如a+b、a+b*(c+d)等都属于中

... 4115

nyoj-----前缀式计算

前缀式计算 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式。 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是...

weixin_33852020的博客 205

郁闷的C小加(三)

郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。 输入第一行输入一个整数T,共有

wanghandou的博客 358

2016河南ACM省赛-A-表达式求值

描述假设表达式定义为: 1. 一个十进制的正整数X是一个表达式。 2. 如果X和Y是表达式,则X + Y, X * Y也是表达式;优先级*高于+。 3. 如果X和Y是表达式,则函数Smax(X, Y)也是表达式,其值为:先分别求出X,Y值的各位数字之和,再从中选最大值。 4. 如果X是表达式,则(X)也是表达式。 例如: 表达式 12*(2+3)+Smax(333,220+28

逐梦者 2873

ACM--表达式求值实现

这个是南阳OJ上的第35题,地址:点击打开链接     表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。 比如输入:“1+2/4=”,程序就输出1.50(结

戎码人生 2650

ACM: 表达式求值

文章目录一、题目大意二、解题思路一 一、题目大意 二、解题思路一 由于含有括号,所以我们只需要考虑数字的顺序,而不用考虑运算符优先级,**也就是说我们可以在任意两个数字之间插入+或者*。**这样经过dfs,就可以直接得到答案。 #include<iostream> using namespace std; int ans; void dfs(int a, int b, int c...

Wangpeiyi9979的博客 415

表达式求值 ACM 数据结构

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=305 描述:         Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练 ,             Dr.Kong设计的机器人卡多甚至会计算一种

于沛杰的博客 545

NYOJ-35-表达式求值

描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)输入 第一行输入一个整数n,共有n组测试数据(n<10)。 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结

逐梦者 6256

别样表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=305 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经

chwei_cson的专栏 1030

华为OJ(表达式求值)

描述 给定一个字符串描述的算术表达式,计算出结果值。输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。     /*    功能: 对输入的字符串表达式进行求值计算,并输出结果。     输入:String inputString:表达式字符串                返

yiqiwangxi的专栏 2486

表达式树 acmoj22049 计算表达式的值

传送门:点击打开链接 思路:一个非常完整的有着16种操作符号的表达式计算,基本思路也是表达式树,可以看我另外一文章点击打开链接 要注意的地方: 1.符号非常多,别漏了或者弄混。 2.注意有的运算符有2个,要多加点判断 #include #include #include #include #include #include #include #include #include #incl

qwb的博客 1579
上一篇: nyoj ACM:前缀式计算( 堆栈的使用 或 递归 )
下一篇: 名校和非名校最重要差距,悄悄影响着我们的一生
丁磊_Ml
博客等级 码龄11年 95粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值