2016-03-05 7 views
0

Я пишу код, который преобразует infix в postfix для назначения hw. Я отлаживал его, но я не могу понять, почему, когда он выскакивает из стека она возвращает «(» вместо «+»Почему стек сбрасывается (а не +

StackInterface<Character> stack = new ArrayStack<Character>(); 
     String postfix = ""; 
     int length = infxEx.length(); 
     for(int i =0; i != length; ++i){ 

      char oneChar =infxEx.charAt(i); 
     if(oneChar == '('){ 
      stack.push(oneChar); 
      }else 
     if(oneChar == '*' || oneChar == '/'|| oneChar == '%'|| oneChar == '+' || oneChar == '-'){ 
      stack.push(oneChar); 
     //error checking input is int 
     } 
     else if(oneChar == ')'){ 
      while (stack.pop() != '(' && !stack.empty()){ 

      char popoff = stack.pop(); 
      postfix = postfix + popoff; 
     } 
     } 

Спасибо!

+1

Добавление ввода, которое позволяет нам воспроизводить проблему, было бы неплохо. – fabian

+0

Этот алгоритм неверен. Он не обрабатывает приоритет оператора. Вам нужно найти алгоритм Дейнстра-Шунтинга. – EJP

ответ

0

в вашем цикле для обработки достигая ), вы поп дважды из стека для каждого элемента вы проверить (первый в состоянии в то время как для проверки stack.pop() != '(' и снова в теле цикла, чтобы захватить popoff, поэтому вы потеряете около половины символов, так как это три ggeded, достигнув ) в основном цикле, и поскольку вы игнорируете все, что не является оператором (так что ваш стек для (a + b) будет содержать (+, и вы будете снимать с + при проверке на (, что означает, что вы добавите ( в ваш постфикс в цикле тела while, и завершите цикл, когда стек пуст.

Используйте операцию peek для просмотра верхней части стека без фактического удаления значения в вашем состоянии while while, чтобы решить эту проблему, и если вы принимаете токены, отличные от операторов в ваших инфиксных выражениях, вам понадобится статья else для обработки этого случая.