一、[参考文献:严蔚敏.数据结构(C语言版)]。
二、功能演示。
1、测试例子。
2、测试结果。
三、对表达式进行校验。
怎么对输入的字符串表达式进行校验呢?
1、对表达式按操作符进行拆分(返回一个字符串数组)。
2、语法判断(对1返回的字符串数组的每一个元素进行语法检查)。
(1)、判断是否为实数(用正则表达式)。
(2)、判断是否为操作符(+,-,*,/,(,))。
(3)、判断是否为运算符(+,-,*,/)
(4)、判断当前每一个元素是符合表达式语法。
数字:
a、可以开头;
b、可以结尾;
c、如果不是开头也是不结尾,那么它之前的元素必须为[(,+,-,*,/]5个中任意一个,之后的元素必须为[+,-,*,/,)]5个中任意一个。
( | 数字 | ) |
+, -,*,/ | +, -,*,/ | |
无 | 无 |
运算符“+,-,*,/“:
a、运算符之前的元素必须为[数字, )]两者中任意一个;
b、之后的元素必须为[数字,(]两者中任意一个。
数字 | +,-,*,/ | 数字 |
) | ( |
操作符[+,-,*,/]除外的[(,)]
“(“:
a、可开头或者,如果不是开头那么它之前的元素必须为运算符[+,-,*,/,(]中任意一个;
b、它之后的元素必须为[数字,(]两者中任意一个。
+, -,*,/ | ( | 数字 |
( | ( | |
无 |
“)“:
a、之前的元素必须为[数字,)]两者中任意一个;
b、它可以做为结束符,如果不是结束符那么它之后的元素必须为运算符[+,-,*,/,)]中任意一个。
数字 | ) | +, -,*,/ |
) | ) | |
无 |
3、通过假运算对表达式的中的括号进行匹配校验。
既然可以用算符优先算法对中缀表达式进行求值,那么可不可以用算符优先算法来对中缀表达式进行校验呢?在算符优先算法中当当前读到的操作符的优先权低于操作符栈的栈顶元素的时候,就将操作符栈退一次栈取得一个操作符,操作数栈退两次栈取得两个操作数,然后按操作符对两个操作数进行运算,并把结果入操作数栈。在这个地方稍做修改,取得操作符和操作数后,不进行运算,而把其中一个操作数当作运算结果入操作数栈。如果表达式的“#“与操作符栈的”#“不能相遇,则表达式是错误的;当表达式的“#“与操作符栈的”#“相遇的时候,如果操作数栈的元素数量为1那么这个表达式是正确的,否则是错误的。
四、表达式求值(算符优先算法)。
五、表达式求值类完整代码。
六、原码下载