简单表达式求值解题报告
首先判断表达式是否正确。随后利用两种方法进行计算。
判断输入的表达式是否正确:我用了一个 bool 型的函数判断。如果表达式正
确则返回 true。如果错误的话返回 false。传入的是一个字符串也就是输入的表达式。
首先将字符串中的空格去掉。把表达式定义成全局变量,这样就可以在判断函数中
给表达式直接去掉空格,而不必返回数组指针。
判断是考虑很多种情况。编写一个函数判断一个字符是否是数字。另一个函数
判断一个字符是否是符号或小数点。用一个数组存储所有可能的字符。把传入的数
组 a 去掉空格后存入数组 b 中。对 b 进行判断。判断第一位,如果第一位既不是数
字也不是左括号则错误。如果表达式中出现了非法字符则错误。判断连续的两位,
如果连续出现了两个运算符或者小数点与运算符连续出现则错误,例如 4*+43。判
断倒数第二位,如果#号之前出现了运算符或小数点则错误。判断连续的两位,如
果小数点和括号连续出现则错误,例如 35.(。判断连续的两位,如果右括号和数字
相继出现或者数字和左括号相继出现则错误,例如 46(。判断连续的两位,如果左
括号和右括号相继出现或者右括号和左括号相继出现则错误,例如()或)(。以上错
误都要输出错误的位置。
用两个数组分别存储当前位之前(包括当前位)出现的左括号和右括号的个数。
例如(3+4)+3)#。如果在某一位之前出现的右括号比左括号多说明括号不匹配,输
出错误的位置。如果整个表达式的左括号和右括号个数不同则错误。
如果两个小数点之间全是数字则错误。例如 35.235.35。找到一个小数点后,
走过在它之后所有的数字。如果它之后第一个不是数字的字符是小数点则说明小数
点错误。
利用第一种方法:
用递归的方法做思路很好想,因为这个过程与人在做计算时的过程是相同的,
都是现对括号中的式子求解,然后去括号,所以在程序中就是遇到括号就进行递归
直到得到一个不含括号的表达式,在进行计算。然后返回计算结果。
比较困难的就是用什么形式进行储存,由于输入的是一个字符串,用字符串储
存是最直接的,但是对字符串进行数字和操作符的提取很麻烦,而且计算过后还要
在转化为字符串,进行下一次计算。所以想到了先将数字和操作符提取出来,储存
到一个可以储存 int 和 char 型的结构中。这样就可以很方便的进行运算和储存结果,
但是这样也有一个很明显的缺点,就是对一个括号内的表达式进行计算后,几个元
素减少到一个元素,而对数组的删除操作有很麻烦。
最后觉顶用 string 类来记录,一是应为直接与输入对应,可以很方便的进行转
化,二是因为 string 类中封装了大量函数,可以很方便的进行查找删除和提取字串,
这就使得提取数字和去括号的过程大大简化。
决定用 string 进行储存后另一个比较大的问题就是对 string 中数字的提取和还
原,在提取时还比较简单,就是找到两个运算符之间的字符串,对其用 c 中的 atof