我试图通过用一维数组表示它来创建一个队列。我知道人们可能会建议我使用列表甚至默认的 java 队列对象会更轻松,但我是来学习的,所以我不想求助于如此简单的解决方案。到目前为止,我的实现遇到了一些问题:
- 如果队列已满,则无法添加对象。
- 移动物体。
例如 QueueArray -> [ ], [A], [B] 移动它,使其最终如下: QueueArray -> [A], [B], [ ]
现在听我说,问题编号 1#。我的逻辑思维告诉我以某种方式增加队列数组的大小以便能够接收更多对象,事情是我不确定如何在不将所有对象保存到另一个临时数组然后将它们复制到新的更大尺寸的数组。我什至不确定这是否是一种明智可行的方式来执行此操作。
问题 2# 我在想可能只是检查队列数组中的空对象,如果找到它们,只需将元素移动一个索引。
这是我的代码,我也愿意接受其他改进。
import java.util.Scanner;
public class Queue {
Object[] q;
int head, tail;
Scanner in;
public Queue(int size){
q = new Object[size];
menu();
}
public void menu(){
System.out.println("\t");
System.out.println("1. add(x) - Adds the object x to end of the queue");
System.out.println("2. remove() - Removes the first object in the queue");
System.out.println("3. view - Shows contents in queue");
System.out.println("4. exit - Exits program");
System.out.println("Select your operation:"+"\t");
while(true){
in = new Scanner(System.in);
int userInput = in.nextInt();
if(userInput == 1){
System.out.println("Give value of object");
in = new Scanner(System.in);
Object userIn = in.next();
add(userIn);
menu();
}
if(userInput == 2){
remove();
menu();
}
if(userInput == 3){
peek();
menu();
}
if(userInput == 4){
System.exit(0);
}
}
}
// Adds the object to the end of the queue
Object add(Object letter){
// If the queue is not full, add to back of queue
if(tail >= q.length){
System.out.println("Queue is full");
return null;
} else {
q[tail] = letter;
tail++;
}
return tail;
}
// Removes the first object in the queue
Object remove(){
if(q.length == 0){
return null;
} else {
q[head] = null;
head++;
}
return head;
}
// Returns the head, tail and all other objects in the queue
void peek(){
System.out.println("Head: "+q[head]);
System.out.println("Tail: "+q[tail-1]);
System.out.println(q[0]+", "+q[1]+", "+q[2]+", "+q[3]+", "+q[4]+".");
}
public static void main(String[] args){
new Queue(5);
}
}