一次元配列で表現してキューを作ろうとしています。リストやデフォルトのJavaキューオブジェクトを使用することで、より簡単な時間を過ごすことができると人々が提案するかもしれないことは知っていますが、私はここで学ぶために、そのような簡単な解決策に頼りたくありません。これまでのところ、実装に関していくつかの問題が発生しています。
- キューがいっぱいの場合、オブジェクトを追加できません。
- オブジェクトをシフトします。
例:QueueArray-> []、[A]、[B]次のようになるようにシフトします:QueueArray-> [A]、[B]、[]
問題番号1#について、私に聞いてください。私の論理的思考は、より多くのオブジェクトを取り込むことができるようにキュー配列のサイズをどうにかして増やすように指示しています。すべてのオブジェクトを別の一時配列に保存してから新しいものにコピーしない限り、それを行う方法がわかりません。より大きなサイズの配列。これがこれを実行するための賢明で実行可能な方法であるかどうかさえわかりません。
問題2#キュー配列内のnullオブジェクトをチェックし、見つかった場合は、要素を1つのインデックスだけシフトすることを考えていました。
これが私のコードです。他の改善も可能です。
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);
}
}