“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情”
中缀表达式转换为后缀表达式
后缀表达式适合计算式进行运算,尤其是表达式很长的情况下,因此在开发中,需要将中缀表达式转成后缀表达式。
具体步骤如下:
1) 初始化两个栈:运算符栈s1和储存中间结果的栈s2;
2)从左至右扫描中缀表达式;
3)遇到操作数时,将其入栈s2;
4)遇到运算符时,比较其与s1栈顶运算符的优先级:
(1)如果s1为空,或栈顶运算符为左括号“(",则直接将此运算符入栈;
(2)否则,若优先级比栈顶运算符的高,也将运算符压入s1;
(3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4.1)与s1中新的栈顶运算符相比较;
5)遇到括号时:
(1)如果是左括号“(”,则直接压入s1
(2)如果是右括号“)",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
6)重复步骤2至5,直到表达式的最右边
7)将s1中剩余的运算符依次弹出并压入s2
8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
测试代码:
//完成将一个中缀表达式转换成后缀表达式的功能
// 1.由于直接对str进行操作不方便,因此先将“1+((2+3)*4)-5”转换成中缀表达式对应的list
// 即“1+((2+3)*4)-5”转换成ArrayList[1,+,(,(,2,+,3,),*,4,),-,5]
String expression="1+((2+3)*4)-5";
List<String> iNfixExpressionList = toINfixExpressionList(expression);
List<String> parseSuffixExpressionList = parseSuffixExpressionList(iNfixExpressionList);
// //先定义一个逆波兰表达式
// //(3+4)×5-6 所对应的 3 4 + 5 × 6 - =>29
// //(30+4)×5-6 所对应的 3 4 + 5 × 6 - =>164
// //为了方便表达式符号都要用空格隔开
// String suffixExpression="30 4 + 5 * 6 - ";
// List<String> list = getlistString(suffixExpression);
int res=calcluate(parseSuffixExpressionList);
System.out.println("计算的结果是="+res);
}
//将将“1+((2+3)*4)-5”转换成中缀表达式对应的list方法
public static List<String> toINfixExpressionList (String s){
List<String> ls=new ArrayList<String>();
int i=0; //这是一个表达式,用于遍历中缀表达式字符串
String str ;//做多位数的拼接
char c;//没遍历到一个字符,就放入到c中
do{//如果是一个非数字,就直接加入ls中
//str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符。
if((c=s.charAt(i))<48||(c=s.charAt(i))>57){
ls.add(""+c); //还是在前面+""将字符变成字符串类型的数字
i++; //i需要后移
} else {
str="";//先对str进行赋初值的操作
//若是数字则需要进行拼接操作
while (i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57){
str+=c; //拼接操作
i++; //这里同时也是对一个个字符进行操作,也需要i+1
}
//然后再将拼合好的字符串放入list中
ls.add(str);
}
}while (i<s.length()); //若i的长度等于表达式的长度就结束运行
return ls;
}