2015-10-20 87 views
4

測試程序:隊列不產生正確的輸出

public class Test 
{ 
    public static void main(String[] args) 
    { 
     String str = "1 + 4"; 
     new MyClass(str); 
    } 
} 

問題代碼:

import java.util.*; 

public class MyClass 
{ 
    public MyClass(String str) 
    { 
     Stack<String> operators = new Stack<String>(); 
     Queue<String> output = new LinkedList<String>(); 
     String[] tokens = str.split("\\s"); 
     StringBuilder postFixStr = new StringBuilder(); 
     final String isDigit = "[0-9]"; 
     final String isOperator = "[(^/*+\\-)]"; 

     for (int i = 0; i < tokens.length; i++) 
     { 
      if (tokens[i].matches(isDigit)) 
      { 
       output.offer(tokens[i]); 
      } 
      else if (tokens[i].matches(isOperator)) 
      { 
       operators.push(tokens[i]); 
      } 
     } 

     output.offer(operators.pop()); 

     for (int j = 0; j < output.size(); j++) 
     { 
      postFixStr.append(output.poll()); 
     } 

     System.out.print(postFixStr.toString()); 
    } 
} 

輸出:

14 

輸出應爲:

14+ 

如果我改變:

final String isDigit = "[0-9]"; 

要:

final String isDigit = ""; 

輸出:

+ 

我不能讓這兩個數字和符號在隊列中存儲。只有一個或另一個。

回答

3

你的問題實際上是for閉環控制。

替換此:

for (int j = 0; j < output.size(); j++) 
{ 
    postFixStr.append(output.poll()); 
} 

此:

while (output.size() > 0) 
{ 
    postFixStr.append(output.poll()); 
} 

,它會像一個魅力。

說明

作爲表達j < output.size()在每次迭代之前計算和output列表有一個元素每次循環迭代2次和3不按預期移除。

1

您的問題是在for循環中使用「.size()」來確定輸出中元素的數量。由於每次從調用poll()的循環中將元素從輸出中移除,循環會提前退出。

要解決此問題,請在運行循環之前將大小存儲在單獨的變量中。

像這樣:

int size = output.size(); 
for (int j = 0; j < size; j++) 
{ 
    postFixStr.append(output.poll()); 
} 
+0

固定它。謝謝。 – wildExploit