1.シーン
例銀行ライン:
2.はじめキュー
キューは、あなたが達成するために、アレイまたはリンクされたリストを使用することができ、順序付けられたリストです。
フォローFIFO原理:
- まず最初に、データキューに格納されて削除。
- デポジットは後に削除される後
アナログを使用してアレイの概略図:(キューイング)
3.実装1:アナログ・アレイ・キュー
アイデア解析
データ待ち行列を格納する構造体の配列を使用して宣言された場合、それ自体が、順序付けられたリストのキュー、キュー・アレイは、最大容量がmaxSizeのキューである場合、以下に示されています。
- フリーキュー最前最前要素の前にフロントの位置は[]
- 含むキュー後の最後の要素である[最終]
- リア++をし、[リア] ARR挿入:エンキューは、フル、テール・ポインタが戻されたか否かを判定する
- フロント++、次いで除去ARR [フロント]:ポインタが後退する前にキューから削除、それは、空気か否かが判断されます
- 条件を分析すると、キューが空である:場合フロント==リア[空]
- 1] [キューが満杯である - 後==のmaxSizeの:キュー満杯状態かどうかを決定します
コードの実装
// 配列シミュレーションキュー使用-書き込みArrayQueueクラス クラスArrayQueue { プライベート INT maxSizeのを; //は、アレイの最大容量を表す プライベート INT ;フロント// キューヘッド プライベート INTリア; // キューの終わり 専用 のint [] ARR; // データを格納するために使用されるデータ、アナログ・キュー // キューコンストラクタを作成 パブリック ArrayQueue(INT arrMaxSize){ maxSizeの = arrMaxSize; ARR = 新しい新しい INT [maxSizeの]; フロント = -1; //キューのポインティングヘッド、キューのフロントヘッドの前の位置に解析点 REAR = -1; // キューの終わりを指し、データ(即ち、キューが最後のデータである)の終わりに、キューポイント } // キューが満杯であるかどうかを パブリック ブールisFull(){ 返す REARにmaxSizeの== - 1を。; } // キューが空であるかどうか 、パブリック ブールのisEmpty(){ 戻り REAR == フロント; } // キューにデータを追加し 、公共 のボイド addQueue(int型N-){ // 分析キューが満杯である場合 、IF (isFullは()){ するSystem.out.printlnは(「キューがいっぱいになると、データは〜追加できません」)。 返す; } リア ; ++ // 後にシフトさせた後 ARR [リア] = ; N- } // データキューを取得し、キュー パブリック INT getQueue(){ // キューが空かどうかを IF (のisEmpty()){ /を/ 例外スロー スロー 新新のRuntimeException(「キューが空で、データが取ることができない」;) } フロント ++; // フロントシフト リターン; ARR [フロント] } // すべてのデータキューを表示 公共 ボイド(){showQueueを / / トラバース 場合(のisEmpty()){ するSystem.out.println( "キューが空で、データなし~~" ); を返す; } ための(int型 ; Iはarr.lengthを<I ++はI = 0 ){ System.out.printf( " ARR [D%] D =%の\のN-」、I、ARR [I]); } } // データキューヘッドを表示し、注目が抽出されていないデータ パブリック INT headQueue(){ // 分析 IF (のisEmpty()){ スロー 新しい新しいのRuntimeExceptionを( "キューが空である、データなし~~" ); } リターン ARR [フロント+ 1。]; } }
問題
それが機能していないされた後、現在のアレイは、再利用することはできません
最適化モード:アナログ円形キューに配列
4.シミュレーション円形キュー配列
アイデア:
ARR [前]はキューの最初の要素である、つまり、フロントキューの最初の要素を指す:1.front変数を意味して調整します
2.rear変数が調整を行う意味:キューの最後の要素の後の要素へリアポイント、空の空間が規則として所望ので(実容量キュー= maxSizeの-1、配列の範囲を超えてローカルポイントを防止するために与えられているとして理解されます)。
前記キューがその条件で、完全である:(。+リア1)[フル] maxSizeの%==フロント
4.キューが条件で、空である:REAR ==フロント[空]
キュー内の有効データ数:(+ REAR maxSizeと-フロント)maxSizeの%
6.エンキューはその後、リア、ARR [リア]をエンキューする、完全なチームを決定++
7.次に、フロント、最初のキュー、空判定チーム、アウトキューARR [フロント]から除去++
コードの実装
クラスCircleArray { プライベート INT maxSizeと; // 配列の最大容量を表す // フロント意味は可変調整を行う:キューの最初の要素にフロントポイント、すなわち、ARR [フロント]はキューの最初の要素である // フロント0 =の初期値 プライベート int型フロント; // 作るためにリアの調整変数の意味:キューの最後の要素の後の位置にリアポインティング空きスペースは、慣例として所望ので... // リア初期値= 0 プライベート INT REAR; // キューの終わり プライベート INT [] ARR; // このデータは、データを格納するために使用され、アナログキュー パブリック CircleArray(INT arrMaxSize){ maxSizeの = arrMaxSizeと、 ARR= 新規新しい INT [maxSizeの]; } // キューが満杯であるかどうかを パブリック ブールisFull(){ リターン(REAR + 1)maxSizeの%で== フロント; } //は、キューが空であるか否かを判断する パブリック ブールのisEmpty(){ 戻り REAR == フロント; } // キューにデータを追加する 公共 ボイド addQueue(int型N-){ // キューが満杯であるか否かを判断する のiF (isFull()){ System.out.printlnはは( "キューがいっぱいになると、データを追加することはできません〜" ); リターン; } // データは、直接添加 ARR [REAR] = ; N- // REAR移動した後、そこに考慮しなければならないモジュロ REAR =(REAR + 1)%maxSizeの; } // データキューを取得し、キュー パブリック INT getQueue() { // キューが空かどうか のiF (のisEmpty()){ // 例外を投げる スロー 新新(「キューが空で、データが取ることができない」のRuntimeExceptionを); } // 前にキューポイントの最初の要素の出し入れする必要があります // まずフロント一時変数に対応する値を保持 // フロントシフト後2、モジュロ考え // 3.一時的に格納された変数戻り int型値= ARR [フロント]。 フロント =(フロント+ 1)%maxSizeの; 戻り値; } // すべてのデータキューを示す 公共 ボイドshowQueue(){ // 反復 IF (のisEmpty()){ するSystem.out.printlnは(「キューが空で、データなし~~ " ); リターン; } // アイデア:正面からトラバースは、要素数が横断 // 脳 のために(int型 =前面にIを、私はフロント+サイズ(<); I ++は){ System.out.printfを( " ARR [Dの%] D =%\ N-」、maxSizeのI%、ARR [I%maxSizeの]); } } //有効なデータの現在のキュー番号取得 公共の int型のサイズ(){ // REAR = 2 // 前面1 = // 。maxSizeの3 = リターン(maxSizeのREAR + -フロント)%maxSizeの; } // 表示データキューヘッドを、データが取られていないことに注意してください 公共 のint headQueue(){ // 分析 IF (のisEmpty()){ スロー 新新( "キューが空である、データなし~~"のRuntimeExceptionを); } リターンARR [フロント]; } }