这两天学习数据结构中表达式计算的算法,现在小结一下
中缀表达式转后缀表达式(RPN)
1. 建立一个optr栈用来存放操作符
2. 从左到右遍历整个表达式
2.1 若遇到操作数,则将其添加在RPN末尾
2.2 若遇到操作符
2.2.1 如果optr栈为空,操作符入optr栈
2.2.2 如果栈顶操作符优先级小于当前操作符,则当前操作符入栈
2.2.3 如果栈顶操作符优先级大于当前操作符,弹出一个操作符,并将其添加在RPN末尾
这里贴上一张清华数据结构慕课中的优先级对照表
#define N_OPTR 9 //运算符总数
typedef enum { ADD, SUB, MUL, DIV, POW, FAC, L_P, R_P, EOE } Operator; //运算符集合
const char pri[N_OPTR][N_OPTR] = { //运算符优先等级 [栈顶] [当前]
/* |-------------------- 当 前 运 算 符 --------------------| */
/* + - * / ^ ! ( ) \0 */
/* -- + */ '>', '>', '<', '<', '<', '<', '<', '>', '>',
/* | - */ '>', '>', '<', '<', '<', '<', '<', '>', '>',
/* 栈 * */ '>', '>', '>', '>', '<', '<', '<', '>', '>',
/* 顶 / */ '>', '>', '>', '>', '<', '<', '<', '>', '>',
/* 运 ^ */ '>', '>', '>', '>', '>', '<', '<', '>', '>',
/* 算 ! */ '>', '>', '>', '>', '>', '>', ' ', '>', '>',
/* 符 ( */ '<', '<', '<', '<', '<', '<', '<', '=', ' ',
/* | ) */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
/* -- \0 */ '<', '<', '<', '<', '<', '<', '<', ' ', '='
};
还没总结完,待续