#include "ExpressionCal.h" /** * 我想说的: * 说实话,第一个思考题怎么做呢?如果是纯数字表达式的话,双目和三目运算符其实就失去了它的意义,因为实际上根本不会对常数进行操作 * 但我还是要在这里提一下,就在刚刚洗澡的时候,我想到了几种方案,下面我会一一说出: * 1、创建一个状态机,其实就是一个Flag标志,当我们遇到双目和三目运算符的话,Flag为true,然后将会在下次循环进行操作,但这个也带来一个问题,实际上这个只能针对双目的前自增和前自减。 * 2、那么第二点,我认为还可以在数组栈或者操作符栈(个人认为是数组栈好一点)额外维护两个函数指针,一个是之前执行,一个之后执行,但实际上这浪费了大量的空间,所以不值得提倡,而且对于三目运算符其实也未必能够很好地解决。 * 3、这个是我个人认为最好的一点,虽然说读取字符串没有栈来的快,但是我认为在这种情况下可以二者结合,先读取字符串,找到双目和三目运算符,先把各个变量计算出来,然后进行字符串替换。 * 以我目前的水平我的确只能想到这些,但我想,聊胜于无。 * 其实单目我可以写的,但是计算机里面其实单目只有在头部或者括号里才有效,所以只需要判断插入时栈内是否优先级小于等于1即可,所以我有点懒不想写了 * 其实我认为把#换成(和)可以达成一样的效果,甚至来说,这个也符合计算表达式的原理,而且更容易理解一些,处理起来也没有什么差别。 * 如果有那里错误了,还请老师指正。 */ //3/0 int main() { //CalExpression("((0x17*0.0023e3)/23-1.8)^2+1"); string s; cin >> s; CalExpression(s); return 0; }