完全なコードは下を引っ張っ
I.はじめに
名前がキューを示唆するように、我々は同じキュー、FIFOに住んでいるよう。
上記のように、順にキューに25,16,5,9順次それぞれ25,26,5,9データのうちです。
第二に、実装プロセスと思考
実装する下部アレイを使用し、関数がデータに挿入された尾を持って、データは、データを表示する最初のチーム、最初のチームを除去され、キューが満杯であるか否かを判断し、待ち行列が空であるか否かが判定されます。
アレイの特定のセクションにストアキュー要素は、アレイは、キュー内の連続しているので、キュー・アレイにおける可変マーク位置を使用します。
1、ライティングクラスと属性
私たちは、終了インデックス変数タグのチームは、配列の最後の要素を配列インデックスでフロント変数タグのチームの最初の要素を使用して、キュー内の要素の数をマーク変数の要素を使用することができます。
public class MyQueue {
private Object[] arr;//存放队列元素的数组
private int elements;//队列元素数量
private int front;//队头元素在数组中的索引
private int end;//队尾元素在数组中的索引
public MyQueue() {
arr = new Object[10];
elements = 0;
front = 0;
end = -1;
}
public MyQueue(int maxSize) {
arr = new Object[maxSize];
elements = 0;
front = 0;
end = -1;
}
}
2、キューが空であります
要素マークキュー要素の可変数はnullにゼロであります
public boolean isEmpty() {
return elements == 0;
}
3、キューがいっぱいの場合
配列の長さと完全に等しいキュー内の要素の数
public boolean isFull() {
return elements == arr.length;
}
図4に示すように、ヘッド素子を得るために
配列インデックスを取得front
要素
public Object peek() {
return arr[front];
}
5、チームは最初の要素を削除しました
配列インデックス除去都度front
要素は、次の要素は、最初のチームになることであるfront+1
、キュー内の要素の数elements-1
。あなたが他の正常な動作条件の場所をマークするために、変数リセットに直接最後の要素を持っている場合は、キューは何もする必要は、その後、空でない場合、考慮すべき3つのケースがあります。
public Object remove() {
if (isEmpty()) {
throw new RuntimeException("队列已经是空的,放心使用吧");
}
Object value = arr[front++];
//如果已经是最后一个元素了,将指针重置即可
if (elements == 1) {
end = -1;
front = 0;
elements = 0;
} else {
elements--;
}
return value;
}
6、挿入
我々は継続的に利用できるキューを作成するので、次のような状況を考慮してください。
(1)ストレージ・アレイ・キュー(キューが満杯である)一杯になる、これは要素の完全な理解が容易で尾に追加することはできません。
(2)配列内のキュー要素最後に、キューの先頭から要素がアレイの尾、空きすなわち後方位置(図を参照するように移動された場合、アレイ内のキューは、連続的であるためです。 )。
public void insert(Object value) {
//检测队列是否已经满了
if (isFull()) {
throw new RuntimeException("队列内元素已达到设定长度");
}
//如果后面没有空位置,将余下元素放到数组的头
if (elements > 1 && end == arr.length - 1) {
int i = 0;
for (; i < elements; i++, front++) {
arr[i] = arr[front];
}
front = 0;
end = i-1;
}
//其他情况正常向后添加元素
arr[++end] = value;
elements++;
}
7、テスト
public static void main(String[] args) {
MyQueue queue = new MyQueue(4);
queue.insert(11);
queue.insert(12);
queue.insert(13);
queue.insert(14);
queue.remove();
queue.remove();
queue.insert(16);
//queue.remove();
//queue.remove();
//queue.insert(19);
//queue.insert(20);
queue.remove();
queue.remove();
queue.insert(21);
queue.insert(22);
while (!queue.isEmpty()) {
System.out.println(queue.remove());
}
}
第三に、完全なコード
package com.jikedaquan.datastruct;
public class MyQueue {
private Object[] arr;
private int elements;//队列元素数量
private int front;//队头元素在数组中的索引
private int end;//队尾元素在数组中的索引
public MyQueue() {
arr = new Object[10];
elements = 0;
front = 0;
end = -1;
}
public MyQueue(int maxSize) {
arr = new Object[maxSize];
elements = 0;
front = 0;
end = -1;
}
//从队尾插入
public void insert(Object value) {
//检测队列是否已经满了
if (isFull()) {
throw new RuntimeException("队列内元素已达到设定长度");
}
//如果后面没有空位置,将余下元素放到数组的头
if (elements > 1 && end == arr.length - 1) {
int i = 0;
for (; i < elements; i++, front++) {
arr[i] = arr[front];
}
front = 0;
end = i-1;
}
arr[++end] = value;
elements++;
}
//删除数据,从队头删除
public Object remove() {
if (isEmpty()) {
throw new RuntimeException("队列已经是空的,放心使用吧");
}
Object value = arr[front++];
//如果已经是最后一个元素了,将指针重置即可
if (elements == 1) {
end = -1;
front = 0;
elements = 0;
} else {
elements--;
}
return value;
}
//查看数据,从队头查看
public Object peek() {
return arr[front];
}
//判断是否为空
public boolean isEmpty() {
return elements == 0;
}
public boolean isFull() {
return elements == arr.length;
}
public static void main(String[] args) {
MyQueue queue = new MyQueue(4);
queue.insert(11);
queue.insert(12);
queue.insert(13);
queue.insert(14);
queue.remove();
queue.remove();
queue.insert(16);
// queue.remove();
// queue.remove();
// queue.insert(19);
// queue.insert(20);
queue.remove();
queue.remove();
queue.insert(21);
queue.insert(22);
while (!queue.isEmpty()) {
System.out.println(queue.remove());
}
}
}