Почему стек вылетает (а не +

Я пишу код, который преобразует инфикс в постфикс для назначения 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 ответ

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

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

Другие вопросы по тегам