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