我有一個問題,我在這個函數中找不到錯誤,它有時候可以很好地處理任何輸入,但是當輸入中有括號時,它會緩存{我想知道錯誤在哪裏此代碼,如何解決它,並有另一種更好的辦法,而不是這樣}將中綴表達式轉換爲後綴表達式
public static String Converting_infix_expressions_to_postfix_expressions(String infix) throws Exception{
StringTokenizer st = new StringTokenizer(infix);
int numOF_tokens = st.countTokens();
String postfix = "" ;
for (int i = 1; i <= numOF_tokens; i++) {
String term = st.nextToken();
try { // if it is an Float there is no problem will happen
float x = Float.parseFloat(term);
postfix += x +" " ;
System.out.println("term is number " + term);
} catch (Exception e) {
System.out.println("term is symbol " + term);
if(stack.isEmpty())
stack.push(term);
else if(term == "(")
stack.push(term);
else if(term == ")"){
while((String)stack.peek() != "(")
postfix += stack.pop() +" ";
stack.pop();
}
else{
int x = 0,y = 0;
switch(term){
case "+": x = 1; break;
case "-": x = 1; break;
case "*": x = 2; break;
case "/": x = 2; break;
}
switch((String)stack.peek()){
case "+": y = 1; break;
case "-": y = 1; break;
case "*": y = 2; break;
case "/": y = 2; break;
}
if(x > y)
stack.push(term);
else {
int x1 = x , y1 = y;
boolean puchedBefore = false;
while(x1 <= y1){
postfix += stack.pop() +" ";
if(stack.isEmpty() || stack.peek() == "("){
stack.push(term);
puchedBefore = true;
break;
}
else{
switch(term){
case "+": x1 = 1; break;
case "-": x1 = 1; break;
case "*": x1 = 2; break;
case "/": x1 = 2; break;
}
switch((String)stack.peek()){
case "+": y1 = 1; break;
case "-": y1 = 1; break;
case "*": y1 = 2; break;
case "/": y1 = 2; break;
}
}
}
if(!puchedBefore)
stack.push(term);
}
}
}
}
while(!stack.isEmpty()){
postfix += stack.pop() +" ";
}
System.out.println("The postfix expression is : " + postfix);
return postfix;
}
在比較字符串時,應該使用['equals'而不是'=='](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java)。 – assylias
您是否嘗試過調試?獲取一個您知道失敗的案例並設置一個斷點,然後逐步查看它做出的決定對您沒有意義。此外,工作的表達式示例(以及它們的輸出)和那些不工作(和他們的輸出)將有助於使這是一個更好的問題。 – digitaljoel
代碼中有相當多的重複......你是否考慮寫一個遞歸的遞歸解析器呢? –