标签: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