首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

表达式问题

表达式问题总结

很多时候我们需要求一个表达式,而往往这个表达式可能是嵌套的关系.这种情况一般有两种方法:

1.用递归的方法(这个......我递归不熟练,所以这里我就不介绍了)2.用栈结构处理

之前在表达式计算那篇推文已经介绍过如何处理一个表达式:

如果是中缀表达式,则把它转换成后缀表达式.

如果是前缀表达式,则从后往前操作就相当于后缀表达式从前往后操作

如果是后缀表达式,那就是最好不过了

ok,现在假设我已经得到了后缀表达式或者前缀表达式(转换方法看之前的推文),那么如何处理呢?这取决于我们的操作函数的参数.如果遇到操作数的数量等于操作函数的参数个数,那么我们就可以把数字pop出来进行操作.比如'+'需要两个操作数,所以我们在遇到'+'的时候pop出两个数,把两个数相加后存回stack

在处理表达式的过程中,我们难免会遇到一些数字,需要把它转换成字符串,或者字符串转换成数字.那么,这在C++中怎么实现呢?答案是使用stringstream:(注意头文件是 )

问题:前缀式计算

描述

先说明一下什么是中缀式:如2+(3+4)5这种我们最常见的式子就是中缀式。而把中缀式按运算顺序加上括号就是:(2+((3+4)5))然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )把括号去掉就是:+ 2 * + 3 4 5最后这个式子就是该表达式的前缀表示。给你一个前缀表达式,请你计算出该前缀式的值。比如:+ 2 * + 3 4 5的值就是 37

输入

有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。以EOF为输入结束的标志。

输出

对每组数据,输出该前缀表达式的值。输出结果保留两位小数。

样例输入

+ 2 * + 3 4 5+ 5.1 / 3 7

样例输出

37.005.53

Accepted code:

接下来再放一道非常好的题目,不愧是大佬放的题目,牛逼!

字符串操作(string)

题目描述

给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,长度为1-500,现有如下若干操作:copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。

find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

insert S N X:在第N个字符串的第X个字符位置中插入S字符串。reset S N:将第N个字符串变为S。print N:打印输出第N个字符串。printall:打印输出所有字符串。over:结束操作。其中N,X,L可由find与rfind操作表达式构成,S,S1,S2可由copy与add操作表达式构成。提示:本题练习string类使用,所有的操作可调用string的方法实现。

输入

第一行为一个整数n(n在1-20之间) 接下来n行为n个字符串,字符串不包含空格及操作命令等。 接下来若干行为一系列操作,直到over结束。

输出根据操作提示输出对应字符串。

样例输入

3329strjvcOpadfk48Ifjoqwoqejrinsert copy 1 find 2 1 2 2 2print 2reset add copy 1 find 3 1 3 copy 2 find 2 2 2 3print 3insert a 3 2printallover

样例输出

Accepted code:https://paste.ubuntu.com/p/nfYCcB7PbJ/

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180419G0289O00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券