测试程序:

public class Test
{
    public static void main(String[] args)
    {
        String str = "1 + 4";
        new MyClass(str);
    }
}

问题代码:
import java.util.*;

public class MyClass
{
    public MyClass(String str)
    {
        Stack<String> operators = new Stack<String>();
        Queue<String> output = new LinkedList<String>();
        String[] tokens = str.split("\\s");
        StringBuilder postFixStr = new StringBuilder();
        final String isDigit = "[0-9]";
        final String isOperator = "[(^/*+\\-)]";

        for (int i = 0; i < tokens.length; i++)
        {
            if (tokens[i].matches(isDigit))
            {
                output.offer(tokens[i]);
            }
            else if (tokens[i].matches(isOperator))
            {
                operators.push(tokens[i]);
            }
        }

        output.offer(operators.pop());

        for (int j = 0; j < output.size(); j++)
        {
            postFixStr.append(output.poll());
        }

        System.out.print(postFixStr.toString());
    }
}

输出:
14

输出应该是:
14+

如果我改变:
final String isDigit = "[0-9]";

至:
final String isDigit = "";

输出:
+

我无法将数字和符号都存储在队列中。只有一个或另一个。

最佳答案

您的问题实际上是 for 循环控制。

替换这个:

for (int j = 0; j < output.size(); j++)
{
    postFixStr.append(output.poll());
}

为了这:
while (output.size() > 0)
{
    postFixStr.append(output.poll());
}

它会像魅力一样发挥作用。

说明

由于表达式 j < output.size() 在每次迭代之前被评估,并且每次循环迭代 2 次而不是预期的 3 次时,output 列表都会删除一个元素。

10-07 19:06
查看更多