中缀表达式转换后缀表达式的规则
public class InToPost { private Stack stack; private String input; private String output=""; public InToPost(String in){ input=in; stack = new Stack<Character>(); } public String doTrans(){ for(int j=0;j<input.length();j++){ char ch = input.charAt(j); switch(ch){ case '+': case '-': gotOper(ch,1); break; case '*': case '/': gotOper(ch,2); break; case '(': stack.push(ch); break; case ')': gotParent(ch); break; default: output=output+ch; break; } } while (!stack.isEmpty()){ output = output+stack.pop(); } System.out.println(output); return output; } public void gotOper(char opThis, int prec1){ while (!stack.isEmpty()){ char opTop=(char)stack.pop(); if(opTop=='('){ stack.push(opTop); break; } else{ int prec2; if(opTop=='+'||opTop=='-') prec2=1; else prec2=2; if(prec2<prec1){ stack.push(opTop); break; } else output=output+opTop; } } stack.push(opThis); } public void gotParent(char ch){ while(!stack.isEmpty()){ char chx = (char)stack.pop(); if(chx=='(') break; else output=output+chx; } } }
利用后缀表达式计算结果:
public int doParse() { Stack theStack = new Stack(); int num1, num2, ans; for (int i = 0; i < output.length(); i++) { char c = output.charAt(i); if (c >= '0' && c <= '9') theStack.push((int) (c - '0')); else { num2 = (int) theStack.pop(); num1 = (int) theStack.pop(); switch (c) { case '+': ans = num1 + num2; break; case '-': ans = num1 - num2; break; case '*': ans = num1 * num2; break; case '/': ans = num1 / num2; break; default: ans = 0; } theStack.push(ans); } } return (int)theStack.pop(); }