2015-10-20 6 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]"; 

To:

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

Ваша проблема заключается в использовании «.size()» в цикле for для определения количества элементов на выходе. Поскольку элемент удаляется из вывода на каждой итерации цикла из вызова poll(), цикл выходит раньше.

Для решения этой проблемы сохраните размер в отдельной переменной перед запуском цикла.

Как это:

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

Это исправлено. Спасибо. – wildExploit

Смежные вопросы