Java プログラミング スキル - データ構造とアルゴリズム「キュー」

Java プログラミング スキル - データ構造とアルゴリズム「キュー」

[[386219]]

基本的な紹介

キューは、配列またはリンク リストを使用して実装できる順序付きリストです。

先入先出の原則に従います。つまり、キューに最初に格納されたデータは最初に取り出され、後に格納されたデータは後で取り出されます。

配列シミュレーションキュー

キュー自体は順序付きリストです。キュー データの格納に配列構造を使用する場合、キュー配列の宣言は以下のようになります。ここで、maxSize はキューの最大容量です。

キューの入力と出力はそれぞれフロントエンドとバックエンドから処理されるため、キューのフロントエンドとバックエンドの添え字をそれぞれ記録するために、front と rear という 2 つの変数が必要です。front はデータ出力に応じて変化し、rear はデータ入力に応じて変化します。


コード例

  1. パッケージ com.structures.queue;
  2.  
  3. java.util.Scanner をインポートします。
  4.  
  5. パブリッククラスArrayQueueDemo {
  6. 公共 静的void main(String[] args) {
  7. ArrayQueue 配列Queue = 新しいArrayQueue(3);
  8. 文字  key = ' ' ; // ユーザー入力を受け入れる
  9. スキャナー scanner = new Scanner( System.in );
  10. ブールループ = true ;
  11. // メニューを出力する
  12. while (ループ) {
  13. System.out.println ( "s(show): キューを表示" );
  14. System.out.println ( "e(exit): プログラムを終了します" );
  15. System.out.println ( "a(add): キューにデータを追加します" );
  16. System.out.println ( "g(get): キューからデータを取得します" );
  17. System.out.println ( "h(head): キューの先頭にあるデータを表示します" );
  18. キー= scanner.next ( ).charAt(0);
  19. スイッチ(キー){
  20. 場合  's' :
  21. 配列キューを表示します。
  22. 壊す;
  23. 場合  'あ' :
  24. System.out.println ( "整数を入力してください" ) ;
  25. int値 = scanner.nextInt();
  26. 配列キューにキュー値を追加します。
  27. 壊す;
  28. 場合  'グ' :
  29. 試す {
  30. intキュー = arrayQueue.getQueue();
  31. System.out.printf ( "取得されたデータは%dです" 、queue);
  32. }catch (例外 e){
  33. System.out.println (e.getMessage()) ;
  34. }
  35. 壊す;
  36. 場合  'え' :
  37. スキャナーを閉じます() ;
  38. ループ = false ;
  39. 壊す;
  40. 場合  'h' :
  41. 試す {
  42. 配列キューのheadQueue();
  43. System.out.printf ( "キューの先頭から取り出されたデータは%dです" ,head);
  44. }catch (例外 e){
  45. System.out.println (e.getMessage()) ;
  46. }
  47. デフォルト
  48. 壊す;
  49. }
  50. }
  51. System.out.println ( "プログラムが終了します" ) ;
  52. }
  53. }
  54.  
  55. //配列を使用してキューをシミュレートする - ArrayQueueクラスを記述する
  56. クラスArrayQueue {
  57. //配列の最大容量を示します
  58. プライベートint maxSize;
  59. //キューの先頭
  60. プライベートintフロント;
  61. // キューの末尾
  62. プライベートintリア;
  63. //データの保存とキューのシミュレートに使用
  64. プライベートint []arr;
  65.  
  66. //キューコンストラクタを作成する
  67. パブリックArrayQueue( int arrMaxSize) {
  68. 最大サイズ = arrMaxSize;
  69. arr = 新しいint [最大サイズ];
  70. front = -1; //キューの先頭の前の位置を指す
  71. rear = -1; // キューの末尾のデータ、つまりキューの最後のデータを指します
  72. }
  73.  
  74. // キューがいっぱいかどうか確認する
  75. パブリックブール値isFull() {
  76. リア == maxSize - 1 を返します
  77. }
  78.  
  79. // キューが空かどうか確認する
  80. パブリックブール値isEmpty() {
  81. 後方 == 前方を返します
  82. }
  83.  
  84. //キューにデータを追加する
  85. パブリックvoid addQueue( int n) {
  86. 満杯の場合(){
  87. System.out.println ( "キューにデータを追加できません" ) ;
  88. 戻る;
  89. }
  90. rear++; //後部を後方に移動する
  91. arr[後方] = n;
  92. }
  93.  
  94. //キューデータを取得してキューを終了する
  95. 公共 整数getQueue() {
  96. 空の場合(){
  97. throw new RuntimeException( "キューが空なので、データを取得できません" );
  98. }
  99. フロント++;
  100. arr[front]を返します
  101. }
  102.  
  103. //すべてのキューデータを表示
  104. パブリックvoid showQueue() {
  105. 空の場合(){
  106. System.out.println ( "キューは空です。データがありません" ) ;
  107. }
  108. ( int i = 0; i < this.arr.length; i++) {
  109. システム.out.printf ( "arr[%d]=%d\n" , i, arr[i]);
  110. }
  111. }
  112.  
  113. //キューヘッダーデータを表示します。データを取得するのではないことに注意してください
  114. 公共  intヘッドキュー() {
  115. 空の場合(){
  116. throw new RuntimeException( "キューが空です。データがありません" );
  117. }
  118. arr[front + 1]を返します
  119. }
  120.  
  121. }

問題分析

  1. 現在、この配列は一度しか使用できず、再利用の効果は得られません。
  2. この配列を循環キューに改善するアルゴリズム: modulo%

リングキューを改善するためのアイデアの分析

  1. front変数の意味が調整されました。frontはキューの最初の要素を指します。つまり、arr[front]はキューの最初の要素であり、frontの初期値は0です。
  2. リア変数の意味は調整されています。リアはキューの最後の要素の後の位置を指します。これは慣例的にスペースを残したいためです。リアの初期値は0です。
  3. キューがいっぱいの場合、条件は (rear+1)%maxSize = front になります。
  4. キューが空の場合、後部 == 前面が空になります。
  5. このように分析すると、キュー内の有効なデータの数 = (rear + maxSize - front) % maxSize となります。

リングキューのコード例

  1. パッケージ com.structures.queue;
  2.  
  3. java.util.Scanner をインポートします。
  4.  
  5. パブリッククラスCircleArrayQueue {
  6. 公共 静的void main(String[] args) {
  7. CircleArray arrayQueue = new CircleArray(4); //ここで4を設定します。キュー内の有効なデータの最大数は3です。
  8. 文字  key = ' ' ; // ユーザー入力を受け入れる
  9. スキャナー scanner = new Scanner( System.in );
  10. ブールループ = true ;
  11. // メニューを出力する
  12. while (ループ) {
  13. System.out.println ( "s(show): キューを表示" );
  14. System.out.println ( "e(exit): プログラムを終了します" );
  15. System.out.println ( "a(add): キューにデータを追加します" );
  16. System.out.println ( "g(get): キューからデータを取得します" );
  17. System.out.println ( "h(head): キューの先頭にあるデータを表示します" );
  18. キー= scanner.next ( ).charAt(0);
  19. スイッチ(キー){
  20. 場合  's' :
  21. 配列キューを表示します。
  22. 壊す;
  23. 場合  'あ' :
  24. System.out.println ( "整数を入力してください" ) ;
  25. int値 = scanner.nextInt();
  26. 配列キューにキュー値を追加します。
  27. 壊す;
  28. 場合  'グ' :
  29. 試す {
  30. intキュー = arrayQueue.getQueue();
  31. System.out.printf ( "取得されたデータは%dです" 、queue);
  32. }catch (例外 e){
  33. System.out.println (e.getMessage()) ;
  34. }
  35. 壊す;
  36. 場合  'え' :
  37. スキャナーを閉じます() ;
  38. ループ = false ;
  39. 壊す;
  40. 場合  'h' :
  41. 試す {
  42. 配列キューのheadQueue();
  43. System.out.printf ( "キューの先頭から取り出されたデータは%dです" ,head);
  44. }catch (例外 e){
  45. System.out.println (e.getMessage()) ;
  46. }
  47. デフォルト
  48. 壊す;
  49. }
  50. }
  51. System.out.println ( "プログラムが終了します" ) ;
  52. }
  53.  
  54. }
  55.  
  56. クラス CircleArray {
  57. //配列の最大容量を示します
  58. プライベートint maxSize;
  59. //front変数の意味が調整されます。frontはキューの最初の要素を指します。つまり、arr[front]はキューの最初の要素であり、frontの初期値は0です。
  60. プライベートintフロント;
  61. //rear変数の意味は調整されます。rearはキューの最後の要素の後の位置を指します。これは慣例的にスペースを残したいためです。rearの初期値 = 0
  62. プライベートintリア;
  63. //データの保存とキューのシミュレートに使用
  64. プライベートint []arr;
  65.  
  66. パブリックCircleArray( int arrMaxSize) {
  67. 最大サイズ = arrMaxSize;
  68. arr = 新しいint [最大サイズ];
  69. }
  70.  
  71. // キューがいっぱいかどうか確認する
  72. パブリックブール値isFull() {
  73. 戻り値(rear + 1) % maxSize == front;
  74. }
  75.  
  76. // キューが空かどうか確認する
  77. パブリックブール値isEmpty() {
  78. 後方 == 前方を返します
  79. }
  80.  
  81. //キューにデータを追加する
  82. パブリックvoid addQueue( int n) {
  83. 満杯の場合(){
  84. System.out.println ( "キューがいっぱいなので、キューにデータを追加できません" );
  85. 戻る;
  86. }
  87. //データを直接追加する
  88. arr[後方] = n;
  89. //後部を後ろに移動、ここでは係数を考慮する必要があります
  90. リア = (リア + 1) % maxSize;
  91. }
  92.  
  93. //キューデータを取得してキューを終了する
  94. 公共 整数getQueue() {
  95. 空の場合(){
  96. throw new RuntimeException( "キューが空なので、データを取得できません" );
  97. }
  98. //ここで、frontがキューの最初の要素を指していることを分析する必要があります。
  99. //1. まず、frontに対応する値を一時変数に保存します。
  100. //2. フロントを後ろに移動して係数を取ることを検討します
  101. //3. 一時的に保存した変数を返す
  102. int値 = arr[front];
  103. 前面 = (前面 + 1) % 最大サイズ;
  104. 戻り値;
  105. }
  106.  
  107. //すべてのキューデータを表示
  108. パブリックvoid showQueue() {
  109. 空の場合(){
  110. System.out.println ( "キューは空です。データがありません" ) ;
  111. }
  112. // 先頭から走査を開始する
  113. ( int i = front; i < front + size (); i++) {
  114. システム.out.printf ( "arr[%d]=%d\n" 、i%maxSize、arr[i%maxSize]);
  115. }
  116. }
  117.  
  118. // 現在のキュー内の有効なデータの数を計算する
  119. 公共 整数 サイズ() {
  120. (rear + maxSize - front) % maxSize を返します
  121. }
  122.  
  123. //キューヘッダーデータを表示します。データを取得するのではないことに注意してください
  124. 公共  intヘッドキュー() {
  125. 空の場合(){
  126. throw new RuntimeException( "キューが空です。データがありません" );
  127. }
  128. arr[front]を返します
  129. }
  130. }

【編集者のおすすめ】

  1. いいですね、上司からシンプルなワークフロー エンジンを開発するように言われました...
  2. Windows 10 は世界を揺るがす変化をもたらします!今年最初のアップデートが来ました
  3. 2021年に注目すべき6つのサイバーセキュリティトレンド
  4. 近年の Windows 10 における最大の改善点! Windows 10 21H2 新機能プレビュー
  5. Xiao Aiは本当にPC版をリリースしたのか?コンピュータ版のXiao Aiを体験してみましょう

<<:  企業は今後の組織開発においてハイパーオートメーションを採用するでしょうか?

>>:  人工知能は非常に強力だが、人間は必ずしも人工知能に支配されるわけではない。ホーキングは間違っているのだろうか?

ブログ    

推薦する

顔認識は「スマート交通」に役立ち、3つの側面でその価値を実証する

近年、都市化の急速な発展と都市人口の継続的な増加により、都市交通の重要性がますます高まっています。わ...

...

農業生産性を最適化するスマート農業監視ソリューション

すべての IoT ソリューションの中で、スマート農業システムは間違いなく際立つでしょう。世界経済の中...

A*、ダイクストラ、BFS 経路探索アルゴリズムの視覚的な説明

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

AIを活用してデジタル資産管理ワークフローを効率化する方法

[[412045]]人工知能は、マーケティングテクノロジーを含むあらゆる業界の状況を変えています。マ...

人工知能の環境コストと可能性

人工知能 (AI) は、大衆文化や政治分析において、2 つの極端な形で現れることが多いです。それは、...

AI軍拡競争により、将来のAIハードウェアアーキテクチャの開発に3つの主要な方向性が生まれました。

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

小さなモデル、大きなトレンド! Googleは2つのモデルを提案した。音量は7倍に減少し、速度は10倍に増加する。

[[426899]]ニューラル ネットワーク モデルとトレーニング データのサイズが大きくなるにつ...

Google 中国人がタイムクリスタルを使って何十年も昔の謎を解く!永久機関が再び自然界に出現

2021年11月30日、自然界に再び時間結晶が出現しました。タイムクリスタルは不思議な物質です。理論...

『Thinking Chain: Six Intuitions about Big Models』の著者、ジェイソン・ウェイ氏

ジェイソン・ウェイを覚えていますか?思考連鎖の創始者は、命令チューニングに関する初期の研究を共同で主...

人工知能の次の段階として、なぜインターネットの巨人に期待すべきなのでしょうか?

過去10年間を振り返ると、人工知能の進歩は「目覚ましい」ものと言えます。特に2015年にAlphaG...

将来のスマートホームに AI はどのように統合されるのでしょうか?

人工知能(AI)については多くの誇大宣伝がなされていますが、それは人類のこれまでの発明と同じくらい画...

765,000台の車両が関与!テスラの自動運転は米国で正式に調査中、NIOはすでに渦中に巻き込まれている

[[418112]]テスラは月曜日に駐車中の緊急車両との一連の衝突事故が発生した後、オートパイロット...

人工知能を理解するのに役立つ記事(画像付き)

近年、人工知能(AI)が普及するにつれ、その原理を理解できずにAIを迷信し崇拝する人が増えています。...