1、遵循的原则
中缀表达式转后缀表达式的数据用栈来存储,在遍历中缀表达式的时遵循以下原则:
●对于数字,直接输出
●对于符号:
左括号:不管栈中是否有元素直接进栈
运算符:若栈为空:直接进栈
若栈中有元素,则与栈顶符号进行优先级比较;
若新符号优先级高(默认左括号优先级最低),则直接入栈;
否则就需要弹 出并输出栈顶元素,并将新符号压栈,
右括号:不断将栈顶符号弹出并输出,直到栈顶符号与右括号匹配(即栈顶符号是左括号),再讲栈顶的左括号弹出即可(只需要弹出,不需要输出)
优先级大小:乘除号>加减号>左括号
●遍历结束后,将栈内的元素全部弹出并输出
2. 图文举例
第一步:遍历中缀表达式,第一个读取到的字符是3,按照转换的原则“数字直接输出”,所以将‘3’直接添加到我们的结果中,如图:
第二步: 第二个读取到的字符是‘+’,为运算符,此时栈中为空,所以直接将‘+’入栈,如图:
第三步:遍历到‘4’,与第一步同理,数字直接输出,所以将‘4’添加到结果中,此时结果为3 4;
第四步:遍历到‘*’,栈不为空,所以与栈顶元素比较优先级,此时栈顶元素为‘+’,‘*’的优先级比‘+’号高,所以还是将‘*’直接入栈。
第五步: 此时遍历到了‘(’,因为“左括号直接入栈”,所以同前一步一样,将‘(’入栈即可。
第六步:此时遍历到了‘’7”,是数字,同理与,第一步一样,将‘7’添加到结果中,此时结果为
第七步:此时遍历到了‘-’,是运算符,所以需要与栈顶的‘(’比较优先级大小,‘-’的优先级高,所以将‘-’直接压栈即可。
第八步:此时遍历到了‘2’,是数字所以继续将‘2’添加到结果,此时遍历情况与结果如图:
第九步:遍历到了‘)’ ,所以需要进行括号匹配,从栈中不断弹出并输出栈顶元素,直到匹配到的栈顶元素是左括号,再将左括号弹出即可,具体步骤如图
第十步:中缀表达式已经遍历完,但栈中还有元素,所以将栈中全部元素弹出并输出(添加到结果中)即可,最后如图