アナログキューのアレイ
データキューを格納する構造体の配列を使用して宣言した場合は、それ自体が、順序付けられたリストであるキュー、キュー配列は以下の通りです。ここで、maxSizeのは、キューの最大容量です。
出力キューので、このようにデータが記録されているように、フロント出力が変化する前方および後方キューインデックスの二つの変数前端と後端を必要と処理するために後端部からそれぞれ入力され、後部には、データの変化に応じて入力されます。図示のように:
ストアデータキューが「addQueue」と呼ばれている場合は、addQueueプロセスは、2つの手順が必要です。分析を考えます:
(1)尾ポインタが戻さ:+ 1、リア場合フロント==リア[空]
キューのテール・ポインタが最大リア小規模maxSizeの-1未満である場合(2)、データは後にいう配列要素に格納されている、またはデータを格納することができません。リア== maxSizeの-1] [キューフル
コードの実装:
1 パブリック クラスArrayQueueDemo { 2 3。 公共 静的 ボイドメイン(文字列[]引数){ 4。 // テスト 5 // キューを作成する 6。 ArrayQueueキュー= 新しい新しい ArrayQueue(3。 ) 。7 文字キー= ''; //は、ユーザ入力を受信します 8 スキャナスキャナ= 新しい新しいスキャナ(System.in); 9 ブールループ= trueに、 10 。11 // 出力メニュー 12は 、一方(ループ){ 13であります System.out.println( "S(ショー):キューを表示する" ); 14 のSystem.out.println( "E(出口):プログラムを終了します" ); 15 のSystem.out.println(「A(追加):データを追加します。 "キューする); 16 のSystem.out.println(" G(GET):キューから取られたデータ" ); 17。 のSystem.out.println(" H(ヘッド):「データキューヘッドを参照)、 18である 19。 キー=スキャナ。.next()のcharAt(0); // 文字受け 20がある スイッチ(キー){ 21が ケース 'S' : 22である queue.showQueue(); 23である BREAK 。 24 ケース「」: 25 のSystem.out.println( "番号を入力してください" ); 26は、 INT =値; scanner.nextInt() 27 queue.addQueue(値); 28 BREAK ; 29 ケース 'G' : 30 のtry { 31は INT RES = キュー.getQueue(); 32 System.out.printf( "抽出データDの%の\のN-" 、RES); 33れる } キャッチ(例外E){ 34である のSystem.out.println(e.getMessage()); 35 } 36 BREAK ; 37 [ ケース 'H' : 38である トライ{ 39 INT RES = queue.headQueue(); 40 ( "キューデータの先頭がD%\ N-ある" System.out.printf 、RES); 41である } キャッチ(例外E) { 42である のSystem.out.println(e.getMessage()); 43である } 44れる ケース 'E' : 45 scanner.close(); 46である ループ= falseに、 47 BREAK ; 48 デフォルト: 49 BREAK ; 50 } 51である } 52である のSystem.out.println( "プログラムの終了" ); 53 } 54である 55 } である56 57である // 使用アナログキューアレイ- ArrayQueueクラス書き込む 58 クラスArrayQueue { 59 プライベート INT maxSizeのを; // これは、アレイの最大容量を表す 60 プライベート INTフロントと、// ヘッドキューポイント 61は、 プライベート INT REAR; // テールキューにポイント 62である プライベート INT ARR []。// このデータは、データを格納するために使用され、アナログ・キュー 63は、 64 // キューを作成するためのコンストラクタ 65 公的 ArrayQueue(INT arrMaxSize){ 66 maxSizeの= arrMaxSize; 67 = ARR 新しい新しい INT [maxSizeの]; 68 フロント= -1; // キューのポインティングヘッド、キューのフロントヘッドの前の位置に解析点 69 REAR = -1; // キューのポインティング終了、データの最後にキュー・ポイント(即ち、キューが最後のデータである) 70 } 71である 72 // キューかフル 73は、 公共 ブールisFull(){ 74 リターン REAR maxSizeの== - 1; 75 } 76 77 // キューが空であるか否かを判断する 78 パブリック ブールのisEmpty(){ 79 リターン REAR == フロント; 80 } 81 82 // キューにデータを追加する 83 公共 ボイド addQueue(INT N-){ 84 // 分析キューいっぱいになった 85 場合(isFull()){ 86 のSystem.out.println( "キューがいっぱいになると、データが追加できません" ); 87 リターン; 88 } 89 REAR ++; //リアシフトさせた後 90 ARR [リア] = N-を、 91である } 92 93 // データキューを取得し、キュー 94 公衆 INT getQueue(){ 95 // キューか、空の 96 IF (のisEmpty()){ 97 // 例外がスローすることによって 98に スローを 新しい新規のRuntimeException(「キューが空で、データを取ることができない」); 99 } 100 フロント++ ; 101 リターンARR [フロント]; 102 } 103 104 //はすべてのデータキュー表示 105は 公衆 ボイドshowQueue(){ 106 // 反復 107を IF (のisEmpty()){ 108 のSystem.out.println( "キューが空で、データなし" ); 109 リターン; 110 } 111 112 のための(int型 I 0 =; I <arr.length; I ++ ){ 113 System.out.printf( "ARR [Dの%] D =%\ N-" 、I、ARR [I]); 114 } 115 } 116 117 // 表示データキューヘッド、データは削除されていない 1 18 パブリック INT headQueue(){ 119 IF (のisEmpty()){ 120 スロー 新しい新規のRuntimeException( "キューが空で、データなし" ); 121 } 122 リターン ARR [フロント+ 1 ]; 123 } 124 125 }
分析と最適化:
(1)現在のアレイは、一度使用することはできません再利用の効果を達成できませんでした。
(2)環状アレイに修正されたアルゴリズムを使用して、このアレイ。