嘿大家正在编写一个程序,使用堆栈将中缀表达式转换为后缀表达式,其中输入是从用户读入的。问题是堆栈为空的情况我继续在调用peek()的代码段上获得nullpointer异常。令人困惑的是,我有一个if语句,应该使用对isEmpty()的调用来防止这种情况发生。有任何想法吗?具体来说,输入“A + B-C”是给我带来问题的,尽管“(A + B-C)”完美无缺
import java.util.*;
/**
*
* @author Adam
*/
public class PostfixConversion
{
static Deque<Character> stack = new ArrayDeque<>();
public static boolean precedence(char first, char second)
{
if(first == '+' || first == '-')
return false;
else if(first == '*' || first == '/')
{
if(second == '*' || second == '/')
return false;
else
return true;
}
else
return false;
}
public static String convertToPostfix(String infixExp)
{
int leftCount = 0;
int rightCount = 0;
Character item;
String rightError = "There is no matching left parenthesis.";
String leftError = "There is no matching right parenthesis.";
String postFix = "";
if(infixExp.indexOf(")") < infixExp.indexOf("("))
return rightError;
if(infixExp.lastIndexOf(")") < infixExp.lastIndexOf("("))
return leftError;
for(int i = 0; i < infixExp.length(); i++)
{
if(Character.isLetter(infixExp.charAt(i)))
postFix += infixExp.charAt(i);
if(infixExp.charAt(i) == '(')
{
item = infixExp.charAt(i);
stack.push(item);
leftCount++;
}
if(infixExp.charAt(i) == ')')
{
while(stack.peek() != '(')
postFix += stack.pop().charValue();
stack.pop();
rightCount++;
}
if(infixExp.charAt(i) == '+' ||
infixExp.charAt(i) == '-' ||
infixExp.charAt(i) == '*' ||
infixExp.charAt(i) == '/')
{
if(stack.isEmpty() == false)
{
while(PostfixConversion.precedence(infixExp.charAt(i), stack.peek().charValue()) == false)
{
if(stack.peek().charValue() == '(')
break;
postFix += stack.pop().charValue();
}
}
item = infixExp.charAt(i);
stack.push(item);
}
}
if(leftCount > rightCount)
return leftError;
if(rightCount > leftCount)
return rightError;
return postFix;
}
}
答案 0 :(得分:0)
在以下循环中:
while(stack.peek() != '(')
postFix += stack.pop().charValue();
你不检查堆栈是否已经空了。
以下循环也是如此:
while(PostfixConversion.precedence(infixExp.charAt(i), stack.peek().charValue()) == false)
{
if(stack.peek().charValue() == '(')
break;
postFix += stack.pop().charValue();
}
一旦堆栈变空,peek()
将返回null
,您将从自动装箱中获得NPE。
请注意,只有在输入循环之前,才会检查第二个if
周围的while
。它不会在任何后续迭代中进行检查,因此不会阻止我上面描述的场景。