一、中缀表示转后缀表示的规则
1.遇到操作符时,如果该操作符优先级高于op_stack栈顶的操作符,则直接压入op_stack,如果同级或低于栈顶操作符,则将栈中操作符依次弹出(同时压入输出栈),直到遇到比当前操作符优先级低的,或者遇到了"("。
2."("和")"都不能进入输出栈。
3.对于操作符"(",只有")"才能将其弹出,其他情况不弹出"("。
二、中缀表达式a+(b+c)*d-e的转换后缀表达式的步骤:
(1). 首先初始化两个栈:输出栈out_stack和操作符栈op_stack
(2). 从左至右扫描表达式,遇到操作数则直接压入输出栈,在遇到a时,由于是操作数,将"a"压入out_stack
(3).扫描到"+",由于当前的操作符栈空,直接压入op_stack
(4). 然后读取到"(",由于它的优先级是最高的,直接压入栈。
(5). 然后读取到操作数"b",压入输出栈 out_stack。
(6). 继续读取到 "+" ,当前操作符栈的栈顶是"(",因为只有")"才能将其弹出,所以"+"入栈。
(7). 读取的"c"压入输出栈。
(8). 读取到了")",此时开始将操作符栈的操作符依次弹出(同时压入输出栈),直到遇到第一个"(",将"("弹出。
(9). 然后读取到" * ",当前操作符栈的栈顶是"+",优先级低于" * ",所以直接压入栈。
(10). 读取的"d"压入输出栈
(11). 读取到"-",当前栈顶是" * ",比"-"的优先级高,所以" * "弹出(同时压入输出栈,下同),然后栈顶"+"的优先级和"-"相同,也要弹出。此时操作符栈空,"-"压入
(12). 读取到了"e",压入输出栈,此时表达式读取完毕,将操作符栈依次弹出并压入输出栈,完成了转换,输出为abc+d*+e-。