【问题标题】:Java Infix to Postfix method using queue and stack not working使用队列和堆栈的Java中缀到后缀方法不起作用
【发布时间】:2015-04-29 17:27:08
【问题描述】:

我正在尝试在 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;


    }

【问题讨论】:

    标签: java stack infix-notation


    【解决方案1】:

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

     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为空,就push操作符,在代码中是正确的。然后它说如果它不为空,如果刚刚找到的那个比栈顶的优先级更高,则将那个添加到栈顶,否则弹出栈顶并将new操作符添加到堆;这可以按如下方式完成:

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

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 2013-09-23
      • 2015-05-09
      • 2015-05-22
      • 2014-12-22
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      相关资源
      最近更新 更多