以下为表达式求值系列完整算法,借用C++语言,读者不妨对照下图表达式求值算法实例,仔细推敲。
1 /* 2 DATA:2015 1 30 3 From:13420228 4 */ 5 //测试数据: 6 // 4 7 // (0!+1)*2^(3!+4) - (5! - 67 - (8+9)) 8 // (1+2)*3+4*5 9 // 1.000 + 2 / 4 10 // ((1+2)*5+1)/(4^2)*3 11 #include <iostream> 12 #include <cstdlib> 13 #include <cstring> 14 #include <stack> 15 #include <cmath> 16 using namespace std; 17 #define N_OPTR 9 //运算符总数 18 typedef enum { ADD, SUB, MUL, DIV, POW, FAC, L_P, R_P, EOE } Operator; //运算符集合 19 //加、减、乘、除、乘方、阶乘、左括号、右括号、起始符与终止符 20 const char pri[N_OPTR][N_OPTR] = { //运算符优先等级 [栈顶] [当前] 21 /* |-------------------- 当 前 运 算 符 --------------------| */ 22 /* + - * / ^ ! ( ) */ 23 /* -- + */ '>', '>', '<', '<', '<', '<', '<', '>', '>', 24 /* | - */ '>', '>', '<', '<', '<', '<', '<', '>', '>', 25 /* 栈 * */ '>', '>', '>', '>', '<', '<', '<', '>', '>', 26 /* 顶 / */ '>', '>', '>', '>', '<', '<', '<', '>', '>', 27 /* 运 ^ */ '>', '>', '>', '>', '>', '<', '<', '>', '>', 28 /* 算 ! */ '>', '>', '>', '>', '>', '>', ' ', '>', '>', 29 /* 符 ( */ '<', '<', '<', '<', '<', '<', '<', '=', ' ', 30 /* | ) */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 31 /* -- */ '<', '<', '<', '<', '<', '<', '<', ' ', '=' 32 }; 33 34 Operator optr2rank ( char op ) { //由运算符转译出编号 35 switch ( op ) { 36 case '+' : return ADD; //加 37 case '-' : return SUB; //减 38 case '*' : return MUL; //乘 39 case '/' : return DIV; //除 40 case '^' : return POW; //乘方 41 case '!' : return FAC; //阶乘 42 case '(' : return L_P; //左括号 43 case ')' : return R_P; //右括号 44 case '