我正在尝试将中缀转换为Java中的后缀表达式,但不知何故它没有正确读取它或者我的队列实现可能有问题。我试过调试,但我看不出哪里出错。
输入:
2 + 3
4 + 5 + 6
(7 + 8)* 9
输出:
2 +
4 + 5
78
正确的输出将是:
23 +
45 + 6 +
78 + 9 *
这是我的代码:
public int Prior (char c) {
if (c == '/' || c == '*')
return 2;
else if (c == '+' || c == '-')
return 1;
else
return 0;
}
public String convertIn2Post() throws StackException, QueueException{
infix = infix.trim();
for(int i = 0; i < infix.length(); i++) {
if(Character.isDigit(infix.charAt(i))) {
expQueue.enqueue(infix.charAt(i) + "");
}
if (infix.charAt(i) == '(') {
opStack.push(infix.charAt(i) + "");
}
if (infix.charAt(i) == ')') {
while(opStack.peek().equals("(") != true) {
expQueue.enqueue(opStack.pop());
}
opStack.pop();
}
if ( infix.charAt(i) == '+' ||
infix.charAt(i) == '-' ||
infix.charAt(i) == '/' ||
infix.charAt(i) == '*' ) {
if(opStack.isEmpty()){
opStack.push(infix.charAt(i) + "");
}
while(Prior(infix.charAt(i)) <= Prior(opStack.peek().charAt(0))){
expQueue.enqueue(opStack.pop());
if(opStack.isEmpty()){
break;
}
}
}
}
while(!opStack.isEmpty()){
expQueue.enqueue(opStack.pop());
}
for(int y = 0; y < expQueue.size(); y++){
postfix += expQueue.dequeue();
}
return "postfix:: " + postfix;
}
答案 0 :(得分:0)
首先,程序中的一个简单错误是将所有内容出列的循环。请注意,每次循环运行时,它都会检查
y < expQueue.size()
但是,每当一个元素从队列中出队时,该值就会减少。因此,如果大小从6开始,程序将运行y = 0,size = 6,y = 1,size = 5,y = 2 size = 4,y = 3 size = 3,这就是它停止的地方。所以将其更改为while循环:
while(!expQueue.isEmpty())
接下来,将中缀转换为后缀的算法表示如果opstack为空,则推送运算符,这在代码中是正确的。然后它说如果它不是空的,如果刚刚发现的那个优先级高于堆栈顶部的那个,那么将那个添加到堆栈顶部,否则弹出顶部并将新运算符添加到堆栈顶部。堆;这可以按如下方式完成:
if(opStack.isEmpty()){
opStack.push(infix.charAt(i) + "");
}
else
{
String peek = opStack.peek();
if(Prior(peek.charAt(0)) >= Prior(infix.charAt(i)))
{
expQueue.add(opStack.pop());
opStack.push(infix.charAt(i) + "");
}
else
{
opStack.push(infix.charAt(i) + "");
}
}