一、将中缀表达式转换成后缀表达式的具体思路
-
初始化2个栈:运算符栈s1和储存中间结果的栈s2;
-
从左至右扫描中缀表达式;
-
遇到操作数时,将其压入s2;
-
遇到运算符时,比较其与s1栈顶运算符的优先级:
(1)如果s1为空,或栈顶运算符为“(”,则将此运算符入栈;
(2)否则,若优先级比栈顶运算符的高,也将运算符压入s1;
(3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到4.1与新的运算符比较。 -
遇到括号时:
(1)“(”:压入s1;
(2)“)”:依次弹出s1栈顶的运算符,并压入s2,直到遇到“(”为止,此时将这一对括号丢弃; -
重复步骤2至5,直到表达式最右边;
-
将s1中剩余的运算符依次弹出压入s2;
-
依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式。
二、将中缀表达式转换成对应的List
public static List<String> toInfixExpressionList(String s) {
//定义一个List,存放中缀表达式对应的内容
List<String> list = new ArrayList<>();
//用于遍历中缀表达式字符串
int i = 0;
//拼接多位数
String str;
//遍历一个字符就放入c
char c;
do{
//如果c是一个非数字,需要加入到list
if((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {
list.add(c + "");
i ++;
}else {
//如果是一个数,要考虑多位数
//现将str置成""
str = "";
//'0'[48] '9'[57]
while (i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) <= 57) {
//拼接
str += c;
i