算术中缀表达式与后缀表达式
后缀表达式有利于计算机进行计算,中缀表达式有利于人们阅读与表达。
中缀表达式:a+b*c+(d*e+f)*g
对应的后缀表达式:abc*+de*f+g*+
将中缀表达式转化成后缀表达式
需要利用栈这种数据结构才能完成这一转化,在此用队列来存储后缀表达式:
中缀表达式的入栈规则:
1) 遇到操作数,直接输出到队列;
2)遇到操作符,输出到栈中,这个栈是一个操作符严格单调递增栈;(*,/ > +,-)
3)遇到 '(' 左括号,直接输出到栈;
4)遇到 ')' 右括号,则将栈中的操作符都弹出到队列至'(' 左括号停止;
5)若读到中缀表达式末尾,将栈中所有操作符弹出至队列中;
/**
* 将中缀表达式转化成后缀表达式并存储在队列中返回
* @param str
* @return
*/
public static Queue<Character> infixToSuffix(String str) {
Queue<Character> queue = new LinkedList<Character>();
Stack<Character> stack = new Stack<>();//操作符优先级严格单调递增栈
for(char c : str.toCharArray()) {
if(c>='0' && c<='9') queue.offer(c);
else if(c=='(') stack.push(c);
else if(c==')') {
char curOP=stack.pop();
while(!stack.isEmpty() && curOP!='(') {
queue.offer(curOP);
curOP=stack.pop();
}
}
else if(c>='*' && c<='/') {
while(!stack.isEmpty() && stack.peek()!='(' && compare(c,stack.peek())=&#