我有下一个代码将aritmethic表达式从中缀转换为posfix,例如: 2 *(23 + 6)-1,在函数e中,堆栈p已经包含表达式
public static void e(){
String exp;
Stack<String> p = new Stack<String>();
exp = posFija(p);
System.out.println(" "+exp);
}
以下是应该进行转换的两个函数:
public static String posFija(Stack<String> p){
String posFix = "";
Stack<String> temp = new Stack<String>();
Stack<String> s = new Stack<String>();
try
{
while(!p.isEmpty())
{
switch(pref(p.peek())){
case 1:
temp.push(p.pop());
break;
case 3:
case 4:
while(pref(temp.peek()) >= pref(p.peek()))
s.push(t.pop());
temp.push(p.pop());
break;
case 2:
while(!temp.peek().equals("("))
{
s.push(temp.pop());
}
temp.pop();
p.pop();
break;
default:
s.push(p.pop());
}
}
posFix = s.toString();
}
catch(Exception ex)
{
System.out.println("Error");
}
return posFix;
}
private static int pref(String op) {
int prf = 99;
if (op.equals("^"))
prf = 5;
if (op.equals("*") || op.equals("/"))
prf = 4;
if (op.equals("+") || op.equals("-"))
prf = 3;
if (op.equals(")"))
prf = 2;
if (op.equals("("))
prf = 1;
return prf;
}
我遇到的问题是,当开关找到“)”(表达式为2 *(23 + 6)-1)时,它会抛出异常,我不知道如何解决这个问题
答案 0 :(得分:0)
下面的代码将适用于它。请查看我在其中所做的更改。
public static void e() {
String exp;
Stack<String> p = new Stack<String>();
// 2*(23+6)-1
p.push("1"); //Pushing for right to left, or you can reverse stack in posFija if you are pushing from left to right
p.push("-");
p.push(")");
p.push("6");
p.push("+");
p.push("23");
p.push("(");
p.push("*");
p.push("2");
exp = posFija(p);
System.out.println(" " + exp);
}
将temp
的空检查和最后一个元素添加到s
。
public static String posFija(Stack<String> p) {
String posFix = "";
Stack<String> temp = new Stack<String>();
Stack<String> s = new Stack<String>();
try {
while (!p.isEmpty()) {
switch (pref(p.peek())) {
case 1:
temp.push(p.pop());
break;
case 3:
case 4:
while (!temp.empty() && pref(temp.peek()) >= pref(p.peek())) //Empty check
s.push(temp.pop());
temp.push(p.pop());
break;
case 2:
while (!temp.peek().equals("(")) {
s.push(temp.pop());
}
temp.pop();
p.pop();
break;
default:
s.push(p.pop());
}
}
//For last element in temp
if (!temp.isEmpty() && !temp.peek().equals(")")) {
s.push(temp.pop());
}
posFix = s.toString();
//System.out.println("S: " + s);
//System.out.println("P: " + p);
//System.out.println("Temp: " + temp);
} catch (Exception ex) {
System.out.println("Error");
ex.printStackTrace();
}
return posFix;
}
在pref
方法中,使用if-else if-else if
代替if-if-if
。