中缀转后缀具体步骤:
(1)初始化两个栈:运算符栈s1和存储中间结果的栈s2
(2)从左至右扫描中缀表达式
(3)遇到操作数时,将其压入s2
(4)遇到运算符时,比较其与s2栈顶运算符的优先级:
1)如果s1为空,或栈顶运算符为左括号“( ”,则直接将此运算符入栈
2)否则,若优先级比栈顶运算符的高,也将运算符压入s1
3)否则,将s1栈顶到的运算符弹出并压入到s2中,再次转到(4)-1)与s1中新的栈顶运算符相比较
(5)遇到括号时:
1)如果是左括号"(",则直接压入s1
2)如果是右括号")",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
(6)重复步骤(2-5),直到表达式的最右边
(7)将s1中剩余的运算符依次弹出并压入s2
(8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
public class PolandNotation{
public static void main(String[] args){
//TODO Auto-generated mathod stub
//完成一个中缀表达式转成后缀表达式的功能
//说明
//1、1 + ((2 + 3)× 4))- 5 转成 1 2 3 + 4 × + 5 -
//2、因为直接对字符串操作不方便,因此先将这个字符串【1 + ((2 + 3)× 4))- 5】转成一个中缀表达式对应的list
//即"1 + ((2 + 3)× 4))- 5" ==> ArrayList[1,+,(,(,2,+,3,),*,4,),),-,5]
//3、将得到的中缀表达式对应的List ==> 后缀表达式对应的List
//即ArrayList[1,+,(,(,2,+,3,),*,4,),),-,5] ==> ArrayList[1,2,3,+,4,*,+,5,-]
String expression = "1+((2+3)*4)-5";
/**
中缀转后缀的测试代码
List<String> infixExpressionList = toInfixExpressionList(expression);
System.out.println(infixExpressionList);//[1,+,(,(,2,+,3,),*,4,),),-,5]
List<String> parseSuffixExpressionList = parseSuffixExpressionList(infixExpressionList);
System.out.println("后缀表达式对应的List"+suffixExpressionList);//[1,2,3,+,4,*,+,5,-]
*/
//先定义一个逆波兰表达式
// (3 + 4)× 5 - 6 ==> 3 4 + 5 × 6 -
//为了方便,逆波兰表达式的数字和符号使用空格隔开
String suffixExpression = "3 4 + 5 × 6 -";
//思路:
//1、先将 "3 4 + 5 × 6 -"放到ArrayList中
//2、将ArrayList传递给一个方法,遍历ArrayList,配合栈完成计算
List<String> rpnList = getListString(suffixExpression);
System.out.println("rpnList="+rpnList);
int res = calculate(list);
System.out.println("计算的结果是=" + res);
}
//即ArrayList[1,+,(,(,2,+,3,),*,4,),),-,5] ==> ArrayList[1,2,3,+,4,*,+,5,-]
//方法:将得到的中缀表达式对应的List => 后缀表达式对应的List
public static List<String> parseSuffixExpressionList(List<String> ls){
//定义两个栈
Stack<String> s1 = new Stack<String>();//符号栈
//说明:因为s2这个栈,在整个转换过程中没有pop操作,而且后面我们还要逆序输出
//因此比较麻烦,这里我们用List<String> s2替换Stack<String>
List