Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用队列和堆栈的Java中缀到后缀方法不起作用_Java_Stack_Infix Notation - Fatal编程技术网

使用队列和堆栈的Java中缀到后缀方法不起作用

使用队列和堆栈的Java中缀到后缀方法不起作用,java,stack,infix-notation,Java,Stack,Infix Notation,我试图在Java中将中缀表达式转换为后缀表达式,但不知怎么的,它没有正确地读取它,或者我的队列实现可能有问题。我试过调试,但看不出哪里出错了 投入: 2+3 4+5+6 7+8*9 输出: 二,+ 4+5 78 正确的产出将是: 二十三+ 45+6+ 78+9* 这是我的代码: public int Prior (char c) { if (c == '/' || c == '*') return 2; else if (c == '+' || c == '-'

我试图在Java中将中缀表达式转换为后缀表达式,但不知怎么的,它没有正确地读取它,或者我的队列实现可能有问题。我试过调试,但看不出哪里出错了

投入:

2+3

4+5+6

7+8*9

输出:

二,+

4+5

78

正确的产出将是:

二十三+

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;


    }

首先,程序中的一个简单错误是循环,它将使所有内容出列。请注意,每次运行循环时,它都会检查

 y < expQueue.size()
接下来,将中缀转换为后缀的算法表示,如果操作堆栈为空,则按下运算符,这在代码中是正确的。然后它说,如果它不是空的,如果刚刚找到的一个比堆栈顶部的一个优先级高,则将该操作符添加到堆栈顶部,否则弹出顶部并将新操作符添加到堆栈中;这可以通过以下方式完成:

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) + "");
                }
            }
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) + "");
                }
            }