我正在尝试创建一个从输入中打印数据结构的程序。输入和输出如下所示: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这是错误的。我找不到为什么会这样,这里的其他任何人都可以看到吗?
答案 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
,它们都是完全独立的。