码迷,mamicode.com
首页 > 其他好文 > 详细

小学鸡四则运算(用数据结构打败模拟)

时间:2019-10-03 12:23:56      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:character   log   eve   git   运算符   简洁   过程   三次   输出流   

1. github地址:

2. PSP表格:

3. 效能分析:

4. 设计实现过程:

①涉及到分数、整数和运算符的模拟运算,我们应该如何尽可能减少字符串的操作呢?本人受到ACM比赛中大数模板的启发,将分数、整数、运算符封装成一个类,创造出一种新的(假的)数据类型,配合上C++的重载运算符功能,重新定义符号运算,如此一来就可以直接使用+-*/对类对象进行与整数无异的四则运算。这样做还有一个好处,如果后续要添加运算符,如指数运算,直接在类里面添加operator character就可以,计算过程稍加修改就能用了,没有繁琐的字符串操作方便的很。这是数据结构派上用场的第一个地方。

②随机生成运算式子我认为是本次项目最繁琐的地方,我想了好久都想不出很好的简洁方便的写法,因为直接for一遍随机生成括号位置会出现一些完全无用的情况如(a ? b ? c),这样的括号是毫无意义的。另外这样做处理括号的嵌套就比较繁琐,如(a ? (b ? c)) ? d或者(( b ? c ) ? a) ? d,你说怎么rand才好? 考虑到运算符较少,我将所有情况在代码中列举了出来,对称的情况我就不管了比如(a ? b) ? c和a ? (b ? c),后者是前者的对称情况,如果要产生的式子看起来多样化一点只需要reverse一下数组,把括号方向改一下就能做到。但是枚举情况的话扩展性很差,毕竟划分数(贝尔数)的增长是很快的,随着运算式子长度加大情况增长会越来越快,届时没得办法只能乱rand。如有更好的办法欢迎留言。

③计算运算式子,很简单的啦。学过数据结构的都知道,用辅助栈就能将中缀表达式转化为后缀表达式,还能用栈计算后缀表达式的值。用二叉树也行,很秀但没必要,反正时间复杂度都差不多,栈很简单就能实现了,画一棵树多麻烦啊。不知道的请查阅《数据结构与算法分析 C语言描述》。数据结构第二次派上用场。

④如何使得产生的式子的运算路径不同?既然要求路径不同很自然就会想到树结构,我这里偷懒了直接用C++的map容器(map<string, bool>,内部红黑树),将数字路径转化为字符串打标记,一旦有两个字符串路径一模一样就重新生成一个就好了。时间复杂度O (n log(n)),最多要我生成1e4个嘛,map的内存和空间都绰绰有余了,如果要生成更多式子比如说1e6个,还是老老实实用字典树好过,O(n)的。数据结构第三次派上用场。

⑤什么生成答案放文件里,对比文件那都是小儿科了,学学输入输出流就能搞定。

流程图如下:

5. 代码说明:没写完注释呢

6. 测试运行:广告位招租

小学鸡四则运算(用数据结构打败模拟)

标签:character   log   eve   git   运算符   简洁   过程   三次   输出流   

原文地址:https://www.cnblogs.com/courierlo/p/11618350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!