双方向のシーケンシャルキューArrayDequeおよび双方向チェーンキューLinkedList、JDKが含まれていますが、ここでは省略されています。 ArrayDequeにはシーケンシャルスタックとシーケンシャルキューが含まれ、LinkedListにはチェーンスタックとチェーンキューが含まれています。 ArrayDequeとLinkedListはどちらもスレッドにインスケイアルです。 PriorityQueueの優先キューはJDKにもあります。
1。シーケンシャルキューの実装
パッケージlang; import java.io.serializable; import java.util.arrays;/** * @classname:arrayqueue * @description:@date 2014年1月20日午後3時46:19最終的な長いserialversionuid = 733344126529379197l; private int default_size = 10;プライベートint容量; //配列の長さを保存プライベートオブジェクト[] elementData; //配列を定義して、シーケンシャルキューの要素を保存してプライベートint front = 0; elementData = new Object [caperacity]; } //シーケンシャルキューを作成しますpublic arrayqueue(t element){this(); elementData [0] = element;リア++; } public arrayqueue(int initize){elementData = new Object [initize]; } / ***指定された長さの配列を使用して注文キューを作成* @param要素は、注文キューの最初の要素を指定します* @param initsize注文キューの基礎となる配列の長さを指定します* / public arrayqueue(t element、int initize){this.capacity = initize; elementData = new Object [caperacity]; elementData [0] = element;リア++; } / ** * @title:size * @description:シーケンシャルキューのサイズを取得 * @return * / public int size(){return Rear -front; } / ** * @title:offer * @description:enqueue * @param要素 * / public void offer(t element){ensureCapacity(Lear + 1); elementData [Lear ++] = element; } private void ensurecapacity(int mincapacity){//配列の元の長さが現在の必要な長さよりも小さい場合int oldcapacity = elementdata.length; if(mincapacity> oldcapacity){int newcapacity =(oldcapacity * 3) / 2 + 1; if(newcapacity <mincapacity)newcapacity = mincapacity; // mincapacityは通常サイズに近いため、これはwinです。 }} / ** * @title:poll * @description:dequeue * @return * / public t poll(){if(isempty()){throw new new indexoutofboundsexception( "ealth queue exception"); } //キューのフロントエンドの要素の値を保持しますoldvalue =(t)elementData [front]; //キューelementDataのフロントエンドの要素をリリースします[front ++] = null; OldValueを返します。 } / ** * @title:peek * @description:queueの最上位要素を返しますが、queueの上部要素を削除しません * @return * / public t peek(){if(isempty()){throw new new new indexoutofboundsection( "空のキュー例外"); } return(t)elementData [front]; } / ** * @title:isempty * @description:注文キューが空のキューであるかどうかを判断します * @return * / public boolean isempty(){return rear == front; } / *** @title:clear* @description:注文queue* / public void clear(){//基礎となる配列のすべての要素をnull arrays.fill(elementdata、null)に割り当てる; front = 0;リア= 0; } public string toString(){if(isempty()){return "[]"; } else {stringbuilder sb = new StringBuilder( "["); for(int i = front; i <rerie; i ++){sb.append(elementData [i] .toString()+"、"); } int len = sb.length(); return sb.delete(len -2、len).append( "]")。toString(); }}}2。チェーンキューの実装
パッケージlang; import java.io.serializable;/** * @classname:linkqueue * @description:@date 2014年1月21日午後3時24:38 */パブリッククラスのリンク<t>は、シリアル化可能{/** * @fieldsioniod:todoido */private stationuid:@fields -6726728595616312615L; //内部クラスのノードを定義すると、ノードインスタンスはチェーンキューのノードを表します。プライベートクラスノード{private t data; //ノードプライベートノードのデータを保存します。 this.next = next; }}プライベートノードフロント; //チェーンキューのプライベートノードリアのヘッドノードを保存; //チェーンキューのテールノードを保存するプライベートINTサイズ; //チェーンキューに既に含まれるノードの数を保存しますnull front = null;リア= null; }/** * <p>タイトル:linkqueue </p> * <p>説明:チェーンキューに1つの要素のみがあるデータ要素を指定してチェーンキューを作成します</p> */public linkqueue(t element){front = newノード(要素、null); //ノードリア=フロントのフロントとリアポイントの1つのノードのみ。サイズ++; } / ** * @title:size * @description:シーケンシャルキューのサイズ * @return * / public int size(){return size; } /** * @title:offer * @description:enqueue * @param element * /public void offer(t element){//チェーンキューがまだ空のチェーンキューである場合if(front == null){front = new Node(element、null);リア=フロント; //ノードにフロントとリアポイントが1つだけあります} else {node newNode = newノード(要素、null); // new node.next = newNode; //新しく追加されたノードリア= newNode; //新しいテールノードを取得する新しいノードの次のテールノードポイントを作成します。 } / ** * @title:poll * @description:dequeue * @return * / public t poll(){node oldfront = front; front = front.next; oldfront.next = null;サイズ - ; OldFront.Dataを返します。 } / ** * @title:peek * @description:キューの最上位要素を返しますが、キューの上部要素を削除しません * @return * / public t peek(){return recor.data; } / ** * @title:isempty * @description:注文キューが空のキューであるかどうかを判断します * @return * / public boolean isempty(){return size == 0; } / *** @title:clear* @description:注文queue* / public void clear(){//フロントとリアのノードをnull front = nullとして割り当てます。リア= null;サイズ= 0; } public String toString(){//チェーンキューが空のチェーンキューである場合isempty()){return "[]"; } else {stringbuilder sb = new StringBuilder( "["); for(node current = front; current!= null; current = current.next){sb.append(current.data.tostring() + "、"); } int len = sb.length(); return sb.delete(len -2、len).append( "]")。toString(); }} public static void main(string [] args){linkqueue <string> queue = new linkqueue <string>( "aaaa"); // 2つの要素を追加しますqueue.offer( "bbbb"); queue.offer( "cccc"); system.out.println(queue); // croute queue.poll()要素を削除した後。 system.out.println( "要素の後にキューを削除:" + queue); //もう一度要素を追加しますqueue.offer( "dddd"); system.out.println( "要素の後にキューを再度追加する:" + queue); //もう一度要素を追加しますqueue.poll(); //もう一度要素を追加しますqueue.offer( "eeee"); system.out.println(queue); }}3。円形のキューの実装
パッケージlang; import java.io.serializable; import java.util.arrays;/** * @classname:loopqueue * @description:loopqueue * @date 2014年1月20日午後3時47:14 = -3670496550272478781L; private int default_size = 10;プライベートint容量; //配列の長さを保存プライベートオブジェクト[] elementData; //ループキューの要素を保存する配列を定義してくださいプライベートint front = 0; elementData = new Object [caperacity]; } //初期化要素パブリックループ(t要素)を使用してループキューを作成します{this(); elementData [0] = element;リア++; } / ***指定された長さの配列を使用してループキューを作成* @param要素ループキューの最初の要素を指定* @param Initizeループキューの基礎となる配列の長さを指定します* / publicループ(telement、int initsize){this.capacacity = initize; elementData = new Object [caperacity]; elementData [0] = element;リア++; } //ループキューのサイズを取得しますpublic int size(){if(isempty()){return 0; }リア>フロントを返しますか?リア - フロント:容量 - (フロント - リア); } //キューパブリックvoid add(t element){if(rece == front && elementdata [front]!= null){new new indexoutofboundsexception( "キューがいっぱいである例外"); } elementData [Lear ++] = element; //後部が端に達した場合、頭を戻します=リア==容量? 0:リア; } //キューを削除public t remove(){if(isempty()){show new indexoutofboundsexception( "空のキュー例外"); } //キューの後端に要素の値を保持しますoldvalue =(t)elementData [front]; //キューelementData [Front ++] = nullの後端に要素をリリースします。 //フロントが終了に達した場合、次にフロント=フロント==容量を回しますか? 0:フロント; OldValueを返します。 } //キューの上部要素を返しますが、キューのpublic t element(){if(isempty())の上部要素を削除しないでください。 } return(t)elementData [front]; } //ループキューが空のキューであるかどうかを判断します} //ループキューをクリアパブリックvoid clear(){//基礎となる配列のすべての要素をnull array.fill(elementdata、null)に割り当てます。 front = 0;リア= 0; } public string toString(){if(isempty()){return "[]"; } else {//フロント<リアの場合、有効な要素はフロントとリアの間の要素ですif(front <rerie){stringbuilder sb = new StringBuilder( "["); for(int i = front; i <rerie; i ++){sb.append(elementData [i] .toString()+"、"); } int len = sb.length(); return sb.delete(len -2、len).append( "]")。toString(); } //フロント> =リアの場合、有効な要素はフロント>容量と0-> front {stringbuilder sb = new StringBuilder( "["); for(int i = front; i <容量; i ++){sb.append(elementData [i] .toString()+"、"); } for(int i = 0; i <recor; i ++){sb.append(elementData [i] .toString()+"、"); } int len = sb.length(); return sb.delete(len -2、len).append( "]")。toString(); }}} public static void main(string [] args){loopqueue <string> queue = new loopqueue <string>( "aaaa"、3); // 2つの要素を追加しますqueue.add( "bbbb"); queue.add( "cccc"); //この時点で、キューは完全なSystem.out.println(queue)です。 //要素を削除した後、キューは別の要素queue.remove()を追加できます。 system.out.println( "要素を削除した後のキュー:" + queue); //もう一度要素を追加すると、キューが再びいっぱいになりますqueue.add( "dddd"); system.out.println(queue); system.out.println(queue); system.out.println(queue); //要素を削除した後、キューは別の要素queue.remove()を追加できます。 //もう一度要素を追加すると、キューがもう一度いっぱいになりますqueue.add( "eeee"); system.out.println(queue); }}上記のJavaキューの実装方法(シーケンシャルキュー、チェーンキュー、ループキュー)は、私があなたと共有したすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。