队列没有产生正确的输出

时间:2015-10-20 23:00:25

标签: java regex stack queue

测试程序:

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 = "";

输出:

+

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

2 个答案:

答案 0 :(得分:3)

您的问题实际上是<?php /* PUT data comes in on the stdin stream */ $putdata = fopen("php://input", "r"); /* Open a file for writing */ $fp = fopen("log.txt", "w"); /* Read the data 1 KB at a time and write to the file */ while ($data = fread($putdata, 1024)) fwrite($fp, $data); /* Close the streams */ fclose($fp); fclose($putdata); ?> 循环控件。

替换它:

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次删除一个元素。

答案 1 :(得分:1)

您的问题是在for循环中使用“.size()”来确定输出中的元素数量。因为每次循环调用poll()都会从输出中删除一个元素,所以循环会提前退出。

要解决此问题,请在运行循环之前将大小存储在单独的变量中。

像这样:

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