从输入打印数据结构不起作用

时间:2015-10-09 07:34:58

标签: java data-structures stack queue

我正在尝试创建一个从输入中打印数据结构的程序。输入和输出如下所示:http://puu.sh/kDMc9/2d46462d4d.png。例如,在第一个测试用例中:第一行表示在这种情况下将跟随多少行。然后,如果它是数字1作为一行上的第一个数字,则意味着您要将元素添加到堆栈/队列/优先级队列,2表示您想要取出一个元素,因此一行中的第二个数字是值。然后输出打印,如果它是堆栈,队列,优先级队列,不可能或不确定(可以多于一个)

这是我现在的代码:

import java.util.PriorityQueue;
import java.util.Scanner;


public class DataStructure {

public static void main(String[] args)
{

    while(calculate());
}

private static boolean calculate()
{
    Scanner input = new Scanner(System.in);
    int numberOfRowsPerCase = input.nextInt();

    Stack<Integer> stack = new Stack<Integer>();
    Queue<Integer> queue = new Queue<Integer>();
    PriorityQueue<Integer> prioQueue = new PriorityQueue<Integer>();
    boolean stackBool = true;
    boolean queueBool = true;
    boolean prioQueueBool = true;

    int next;

    for(int i = 0; i < numberOfRowsPerCase; i++)
    {
                next = input.nextInt();
                if(next == 1)
                {
                    next = input.nextInt();

                    stack.push(next);
                    queue.enqueue(next);
                    prioQueue.add(next);

                }

                else if(next == 2)
                {
                    next = input.nextInt();
                    if(!stack.pop().equals(next))
                    {
                        stackBool = false;
                    }

                    else if(!queue.dequeue().equals(next))
                    {
                        queueBool = false;
                    }

                    else if(!prioQueue.poll().equals(next))
                    {
                        prioQueueBool = false;
                    }


                }


                if(stackBool == true)
                {
                    System.out.println("stack");
                }

                else if(queueBool == true)
                {
                    System.out.println("queue");
                }

                else if(prioQueueBool == true)
                {
                    System.out.println("priority queue");
                }

                else if((stackBool == true && queueBool == true) || (queueBool == true && prioQueueBool == true) || (stackBool == true && prioQueueBool == true))
                {
                    System.out.println("not sure");
                }

                else
                {
                    System.out.println("impossible");
                }

    }


    //Check EOF 
    String in;
    in = input.nextLine();
    in = input.nextLine();
    if(in.equals(""))
    {
        return false;
    }


    return true;

}

}

但是当我在上面的图片中运行测试用例时,我的程序打印出这个:https://ideone.com/mIO1bs这是错误的。我找不到为什么会这样,这里的其他任何人都可以看到吗?

1 个答案:

答案 0 :(得分:0)

假设你的逻辑设置布尔标志是正确的那么这部分

if(stackBool == true)
{
    System.out.println("stack");
}
...
else if((stackBool == true && queueBool == true) || (queueBool == true && prioQueueBool == true) || (stackBool == true && prioQueueBool == true))
{
    System.out.println("not sure");
}

永远不会按预期工作,因为第二个条件的某些部分已被第一个条件捕获。

更好的建议是提出一种更清晰的方式来表达这一点。一个仍然可能有用的建议是在if-else链的开头放置更复杂的if语句。

无视上述假设:

if(!stack.pop().equals(next))
{
    stackBool = false;
}

else if(!queue.dequeue().equals(next))
{
    queueBool = false;
}

else if(!prioQueue.poll().equals(next))
{
    prioQueueBool = false;
}

这些不应该是else,它们都是完全独立的。