其实这个东西早在7月开始的时候我就写好了,本来想等小师妹写好了她的版本再放到网上的。。。无奈她写的实在是太慢了。这个东西还是有改进的空间的,比如升级成浮点模型啥的。
逆波兰表达式的可以以O(N)时间复杂度处理任意表达式,其实也叫后缀表达式,中缀表达式(就是我们一般看到的表达式(1+1=2)),处理的时候分两个栈,一个符号栈,一个表达式栈:
(注意我只选二元运算符为例,只处理+-*/和括号)
1. 如果遇到数字,压入表达式栈
2. 如果遇到符号
a. 如果符号是左括号,则直接压入符号栈
b. 如果是*/符号,且符号栈顶符号为+-或者( ,那么直接压入当前符号即可;如果符号栈顶为*/,弹出符号栈顶符号到表达式栈,压入当前符号。
c. 如果是+-号,如果符号栈栈顶是*/,则pop符号栈顶到最近的+-号或者(;如果是+-或者(,那就直接弹出上一个+/-号然后压入当前+/-号。
d. 遇到)就pop符号栈到(
e. 如果把中缀表达式扫完了符号栈还有东西,那么将符号栈的东西全部pop到表达式栈。
后缀转中缀是上面的逆过程,看代码就知道了。
之前有想过改成C++的,但是那段时间忙着出Qt,就没写了,这以后可能每三天就写个算法或者复习下以前的数据结构,备战下下一年的面试,就酱~
以后博客的名字就不分类型拉~感觉直接分类更快。
1 //main.c 2 3 #include <stdio.h> 4 #include "plug.h" 5 #include "stack.h" 6 #include <stdlib.h> 7 #include <string.h> 8 #include <math.h> 9 #include <assert.h> 10 11 int main(int argc, char *argv[]) 12 { 13 int error_exp = 0; 14 char symnum[81] = { '