该任务是使用Stacks创建一个后缀到中缀转换器。该程序编译正确,但当我尝试制作一个演示类时,我收到了零点异常行32.请分享任何观察,更好的编码约定或解决方案。
import java.util.Stack;
public class PostfixtoInfix {
private String expression;
private Stack<Character> s;
Character pOpen = new Character('(');
Character pClose = new Character(')');
public String PostfixtoInfix(String e) {
expression = e;
String output = "";
for (int i = 0; i < e.length(); i++) {
char currentChar = e.charAt(i);
if (isOperator(currentChar)) {
while (!s.empty() && s.peek() != pOpen
&& hasHigherPrecedence(s.peek(), currentChar)) {
output += s.peek();
s.pop();
}
s.push(currentChar);
} else if (isOperand(currentChar)) {
output += currentChar;
} else if (currentChar == '(') {
s.push(currentChar);
} else if (currentChar == ')') {
while (!s.empty() && s.peek() != pClose) {
output += s.peek();
s.pop();
}
}
while (!s.empty()) {
output += s.peek();
s.pop();
}
}
return output;
}
public boolean isOperator(char c) {
if (c == '+' || c == '-' || c == '/' || c == '*' || c == '^')
return true;
return false;
}
public boolean isOperand(char c) {
if (c >= '0' && c <= '9')
return true;
if (c >= 'a' && c <= 'z')
return true;
if (c >= 'A' && c <= 'Z')
return true;
return false;
}
public int getOperatorWeight(char operator) {
int weight = -1;
switch (operator) {
case '+':
case '-':
weight = 1;
break;
case '*':
case '/':
weight = 2;
break;
case '^':
weight = 3;
}
return weight;
}
public boolean hasHigherPrecedence(char operator1, char operator2) {
int op1 = getOperatorWeight(operator1);
int op2 = getOperatorWeight(operator2);
if (op1 == op2) {
if (isRightAssociative(operator1))
return false;
else
return true;
}
return op1 > op2 ? true : false;
}
public boolean isRightAssociative(char op) {
if (op == '^')
return true;
return false;
}
}
答案 0 :(得分:2)
修复NPE 初始化对象。与C ++不同,Stack<Character> s;
相当于Stack<Character> s = null;
; 不到Stack<Character> s = new Stack<>();
!
谨防==
和!=
不的行为与您对盒装对象的期望一样。
Character a = new Character('A');
Character aa = new Character('A');
System.out.println(a == aa);
给出(正确的!)答案false
。
他们是不同的对象。如果要比较相等性,请使用:
System.out.println(a.equals(aa));
System.out.println((char)a==(char)aa);
第一种方法使用显式方法比较对象内容。第二个通过使用非对象原语来避免这个问题,其中相等是按位,而不是引用相等。
答案 1 :(得分:0)
您似乎声明了私人成员s
,从不为其分配任何内容,然后尝试在s.empty()
和s.pop()
等表达式中使用它。如果没有为s
分配任何内容,则它为null
,并且尝试在其上调用方法将导致NullPointerException。
要创建空堆栈,您可能希望将声明更改为:
private Stack <Character> s = new Stack<Character>();
答案 2 :(得分:0)
首先,你有一个看起来像构造函数的方法:
public String PostfixtoInfix(String e) {
尝试将其更改为其他内容,例如:
public String transform(String e) {
其次,永远不会为您的s
字段分配堆栈。放
s = new Stack<Character>();
在你的构造函数中。此外,new Character('a') != new Character('a')
,因为这将绕过自动(枕头缓存)拳击。请使用简单的char
作为pOpen和pClose。
答案 3 :(得分:-2)