Java 使用堆栈和队列进行中缀到后缀的转换。正在尝试将(A+;B转换为AB+;)。现在不用担心括号了

Java 使用堆栈和队列进行中缀到后缀的转换。正在尝试将(A+;B转换为AB+;)。现在不用担心括号了,java,stack,queue,Java,Stack,Queue,我现在的程序适用于所有操作员,比如A+B。它也适用于像A+BxC这样的示例,但是如果您输入AxB+C,它就会出错。我只是不知道我错在哪里。(我知道“x”不是Java的乘法运算符,但星号不会出现)。此外,我们正在使用我们创建的堆栈和队列类 为什么A/B+C不能工作 提前谢谢 public class PostfixEval { public static void main(String[] args) throws IOException { File file = new File(

我现在的程序适用于所有操作员,比如A+B。它也适用于像A+BxC这样的示例,但是如果您输入AxB+C,它就会出错。我只是不知道我错在哪里。(我知道“x”不是Java的乘法运算符,但星号不会出现)。此外,我们正在使用我们创建的堆栈和队列类

为什么A/B+C不能工作

提前谢谢

public class PostfixEval {

public static void main(String[] args) throws IOException {
    File file = new File("infile.txt"); // infile contains single expression
    Scanner kb = new Scanner(file);
    Queue Q1 = new Queue();
    Queue Q2 = new Queue();
    Stack S1 = new Stack();

    while (kb.hasNext()) {
        String equation = kb.next();
        char ch;
        for (int i = 0; i < equation.length(); i++) {
            ch = equation.charAt(i);
            Q1.add2Rear(ch);
        }

        while (!Q1.ismtQ()) {
            ch = Q1.removeFront();
            if (Character.isLetter(ch)) {
                Q2.add2Rear(ch);
            } else if (isOperator(ch)) {
                if (!S1.ismt() && checkPrecedence(ch) <= checkPrecedence(S1.top())) {
                    Q2.add2Rear(S1.pop());
                    ;
                }
                S1.push(ch);
            }

        }
        while (!S1.ismt()) {
            Q2.add2Rear(S1.pop());
        }
    }

    while (!Q2.ismtQ()) {
        System.out.print(Q2.removeFront());
    }

    kb.close();
}

public static boolean isOperator(char ch) {
    boolean retval = false;
    if (ch == '+' || ch == '-' || ch == '/' || ch == '*')
        retval = true;
    return retval;
}

public static int checkPrecedence(char ch) {
    switch (ch) {
    case '+':
    case '-':
        return 1;

    case '*':
    case '/':
        return 2;
    }
    return -1;
}
}
公共类事后评估{
公共静态void main(字符串[]args)引发IOException{
File File=new File(“infle.txt”);//infle包含单个表达式
扫描仪kb=新扫描仪(文件);
队列Q1=新队列();
队列Q2=新队列();
堆栈S1=新堆栈();
while(kb.hasNext()){
字符串方程=kb.next();
char ch;
对于(int i=0;i如果(!S1.ismt()&&checkpreference(ch),那么我是新来的,不确定我是否应该回答我自己的问题,但我已经找到了答案(根据我被指派完成的任务),也许其他人需要答案

这是更新的代码:

if (!S1.ismt()) {
                    if(checkPrecedence(ch) <= checkPrecedence(S1.top())){ 
                        Q2.add2Rear(S1.pop());
                    }
                }
if(!S1.ismt()){

如果(checkpreference(ch),这与你在问题中发布的内容在效果上没有什么不同。你一定改变了其他东西。现在不担心括号是没有用的。你只会得到一些你可能需要大幅度改变的东西。这是一个标准算法,只需全部实现即可。
public class Queue implements QueueInterface {

ArrayList<Character> que = new ArrayList<Character>();

@Override
public void add2Rear(char ch) { // add element to rear of queue
    que.add(ch);

}

@Override
public char removeFront() { // returns first element AND removes it
    char retval = '1';
    retval = que.remove(0);
    return retval;
}

@Override
public char front() { // returns first element
    char retval = '1';
    retval = que.get(0);
    return retval;
}

@Override
public boolean ismtQ() { // true: if empty, false: if otherwise
    boolean retval = true;
    retval = que.isEmpty();
    return retval;
}

}
if (!S1.ismt()) {
                    if(checkPrecedence(ch) <= checkPrecedence(S1.top())){ 
                        Q2.add2Rear(S1.pop());
                    }
                }