Javaキューの実装原則
「キュー」という言葉は、英国の「キュー」と呼ばれるものです。英国の「並んでいる」は、連続して立つことを意味します。コンピューターサイエンスでは、キューはデータ構造であり、これはスタックに少し似ていますが、キューに挿入された最初のデータ項目が最初に削除され、スタックで挿入された最後のデータ項目が最初に削除されます。キューは映画館の前に立っている人々の列のように機能します。最初の人が提携している人は、チケットを購入するためにチームの長に到着します。キューを塗る最後の人はチケットを買うことができます。
キューは、スタックなどのプログラマー向けのツールとしても使用されます。また、銀行で待っている人をシミュレートする、離陸するのを待っている飛行機、またはインターネット上のパケットが送信されるのを待っているなど、実際の環境をシミュレートするために使用することもできます。
コンピューターオペレーティングシステムでは、さまざまなキューが静かに機能しています。印刷ジョブは、印刷キューでの印刷を待っています。キーボードに入力するとき、タイピングを保存するキューもあります。同様に、キーがワードプロセッサを使用してタップされ、コンピューターが一時的に何かを実行する必要がある場合、タップされたコンテンツは失われず、ワードプロセッサがそれを読む時間があるまでキューで待ちます。キューは、処理時にタイピングの順序が変更されないようにするために使用されます。
キューの基本操作
キューの2つの基本操作は、データ項目を挿入する(挿入)、つまり、1つのデータ項目をキューのテールに挿入することであり、もう1つはデータ項目を削除(削除)、つまりチームのヘッドのデータ項目を削除します。これは、チケットを購入するためにキューに並んでから、ラインの終わりまでキューイングする映画愛好家に似ています。その後、ラインの頭に到着してからキューを離れます。
スタック内のデータ項目を挿入して削除するための方法の命名は、プッシュとポップと呼ばれる非常に標準です。キューメソッドは、これまで標準化されていません。 「INSERT」はPut、Add、またはEnqueと呼ばれ、「Delete」はDelete、Get、またはDequeと呼ばれます。挿入データ項目の終わりは、後ろ、尾、または終了することもできます。データ項目を削除するチームのヘッドは、ヘッドとも呼ばれます。挿入、取り外し、前面と背面を以下に使用します。
挿入値をキューのテールに挿入すると、キュー矢印のテールが追加されて新しいデータ項目がポイントされます。
データ項目が削除された後、チームのヘッドが1つ追加されます。通常、キューを実装する場合、削除されたデータ項目はメモリに保存されますが、キューのヘッドが次の位置に移動されたため、アクセスできません。
スタック内のケースとは異なり、キュー内のデータ項目は、常に配列の0の添え字で始まるとは限りません。いくつかのデータ項目を削除した後、ヘッダーポインターはより高い添え字位置を指します。
ビュー操作は、ヘッダーデータ項目の値を返しますが、チームからデータ項目を削除しません。
空のキューからデータ項目を削除するか、データ項目を完全なキューに挿入する場合、アプリケーションにエラーメッセージが促されます。
ループキュー
新しいデータ項目がキューに挿入されると、チームのヘッドのリア矢印がアレイサブスクリプトの大きな位置に向かって上方に移動します。データ項目を削除すると、キューフロントポインターのテールも上方に移動します。このデザインは、人々が映画のチケットを列に並べると常に前進し、その前の人がチケットを購入してキューを離れた後、他の人が前進するため、人々の直接の観察に反するかもしれません。コンピューターのキュー内のデータ項目を削除した後、他のすべてのデータ項目を前進させることもできますが、これは非常に効率的です。代わりに、キューの頭と尾のポインターの動きを通じて、すべてのデータ項目を同じ位置に保ちます。
この設計の問題は、テールポインターがアレイの最後にすぐに移動することです。削除されたデータ項目の場所である配列の先頭に空のデータ項目ユニットがありますが、テールポインターが後方に移動できなくなるため、新しいデータ項目を挿入することはできません。どうすればいいですか?
まとめ治療
キューが不満であるが新しいデータ項目を挿入できないという問題を回避するために、ヘッドとテールのポインターは配列の先頭に戻ることができます。これはループキューです(「バッファリング」とも呼ばれることもあります)。
ポインターラッピングのプロセス:十分なデータ項目をキューに挿入して、アレイの後期にテールポインターがポイントをポイントします。配列のフロントエンドにあるいくつかのデータ項目を削除します。新しいデータ項目を挿入します。テールポインターが端から開始位置に逆転することがわかります。新しいデータ項目がこの場所に挿入されます。
より多くのデータ項目を挿入します。テールポインターは、予想どおり上方に移動します。テールポインターが巻き戻した後、ヘッドポインターの下にあることに注意してください。これは初期位置を逆転させます。これは「壊れたシーケンス」と呼ぶことができます。キュー内のデータ項目は、配列の2つの異なるシーケンスに存在します。
十分なデータ項目を削除した後、チームのヘッドもラップします。この時点で、キューポインターは最初の実行時に位置状態に戻り、ヘッドポインターはテールポインターの下にあります。データ項目は、単一の連続シーケンスにも復元されます。
キュー用のJavaコード
queue.javaプログラムは、insert()、remove()、peek()、isempty()、size()メソッドを挿入するキュークラスを作成します。
パッケージスタックとキュー。
クラスキュー{private int maxsize;プライベートロング[] quearray;プライベートイントフロント;プライベートINTリア;プライベートインターメント; public Queue(int s){maxsize = s; quearray = new long [maxsize]; front = 0;リア= -1; nitems = 0; } public void insert(long j){if(rece == maxsize-1)recor = -1;質問[++リア] = j; nitems ++; } public long remove(){long temp = quearray [front ++]; if(front == maxsize)front = 0; nitems-; return temp; } public long peekfront(){return quearray [front]; } public boolean isempty(){return(nitems == 0); } public boolean iffull(){return(nitems == maxsize); } public int size(){return nitems; }}プログラムによって実装されたキュークラスには、フロント(ヘッド)とリア(チームのヘッド)フィールドだけでなく、キュー内の現在のデータ項目の数もあります:nitems。
INSERT()メソッドの操作の前提条件は、キューが不満であることです。このメソッドはmain()には表示されませんが、挿入()メソッドは通常最初に呼び出され、次にfalseを返した後にisfull()メソッドを呼び出す必要があります。 (より一般的なアプローチは、挿入()メソッドに判断を追加してキューがいっぱいかどうかを確認することです。データ項目が完全なキューに挿入された場合、例外がスローされます。)
一般的に言えば、挿入操作は、背面(チームテールポインター)を追加し、テールポインターが指した位置に新しいデータを挿入することです。ただし、リアポインターがアレイの上部、つまりMaxSize-1位置を指している場合、データ項目を挿入する前に、アレイの下部に巻かなければなりません。巻線操作は背面を-1に設定するため、背面を1に追加すると、0に等しくなります。これは配列の下部にあるサブスクリプト値であり、最終的にNITEMが追加されます。
remove()メソッドの操作の前提条件は、キューが空でないことです。この方法を呼び出す前に、isempty()メソッドを呼び出して、キューが空でないことを確認するか、このエラーチェックメカニズムをremove()メソッドに追加する必要があります。
削除操作は、常にフロントポインターからヘッダーデータアイテムの値を取得し、フロント1を追加します。ただし、フロントの値が配列の上部を超えるようにそうする場合、フロントは配列の添え字が0の位置に戻る必要があります。このテストを行うと、返品値は一時的に保存されます。最後に、NITEMは1つ削減されます。
Peek()メソッドはシンプルで理解しやすいです。フロントポインターが指しているデータ項目の値を返します。一部のキューの実装では、キューエンドデータ項目の値を表示することもできます。たとえば、これらの方法は、Peekfront()、Peekrear()、またはJust Front()およびLear()と呼ばれます。
ISEMPTY()、ISFULL()、およびSIZE()メソッドの実装はすべて、NITEMSフィールドに依存しています。これは、NITEMがMaxsizeに等しいか、独自の値を返すかにかかわらず、0に等しいかどうかを返します。
挿入()およびremove()メソッドは、この変数の値をそれぞれ増やして減少させる必要があるため、QueueクラスのデータカウントフィールドNITEMSを含めると、挿入()およびremove()メソッドに少し追加の操作が追加されます。これは余分なオーバーヘッドではないかもしれませんが、多くの挿入と削除操作を扱う場合、これはパフォーマンスに影響を与える可能性があります。
なぜなら、一部のキューの実装では、データ項目のカウントのフィールドを使用するのではなく、前面と背面を使用して、キューが空かフルであるか、データ項目の数を計算します。これを行うと、前述のように、データ項目のシーケンスが2つのセグメントまたは連続セグメントに崩壊するため、iSempty()、iffull()、およびsize()ルーチンは非常に複雑になります。
そして、奇妙な問題が生じました。キューがいっぱいになると、フロントとリアのポインターが特定の位置になりますが、キューが空になると同じ位置の関係も現れることがあります。したがって、同時に、キューはいっぱいまたは空のように見えるかもしれません。この問題の解決策は、配列容量をキューデータ項目の最大数を超えるものにすることです。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!