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を体験してみましょう

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

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

ブログ    

推薦する

必ず読むべき28の古典的なプログラミングアルゴリズム

最初の 10 個は、聖書からのトップ 10 アルゴリズムです。発起者からの説明: Proofs fr...

...

FacebookはCNN Transformerの利点を組み合わせ、誘導バイアスを柔軟に利用するConViTを提案している

[[411034]] AI 研究者は、新しい機械学習モデルを構築し、パラダイムをトレーニングする際に...

Amap、ADAS警告ナビゲーション機能を発表:視覚AI技術を使用して車両と歩行者の衝突をインテリジェントに警告

11月18日、高徳地図の新バージョンは革新的なADAS警告ナビゲーション機能をリリースしました。視覚...

ジェフ・ディーンの1万語の記事:2020年のGoogleの10大分野におけるAI技術の発展

ジェフ・ディーン氏は数万語に及ぶ長文の記事を公開し、過去1年間のGoogleのさまざまな分野での成果...

Python 開発者ガイド: 機械学習に役立つ 10 の実践方法!

[[327915]] 【51CTO.com クイック翻訳】データ サイエンティストとして、私たちは...

USTCのニューラルネットワークとエンドツーエンドのトレーニングフレームワークは、教育環境が学生の能力に与える影響を調査する

[[424271]]中国科学技術大学の研究者らは、教育コンテキスト認識型認知診断フレームワークを提案...

ブラックテクノロジー界の「魏英洛」は人の表情を読むのが得意

[51CTO.comよりオリジナル記事] 今ではAIでも人の表情を読んだり、心を理解したり、感情を分...

AI アバターが CES に登場! Samsung の Neon チャットボットは学習、進化、記憶が可能です!

サムスンの待望のスマートヒューマンプロジェクト「Neon」が、ついにCES 2020でデビューしまし...

...

Pytorchの核心部分である自動微分化を突破! !

こんにちは、Xiaozhuangです! PyTorch での自動微分演算に関して、この論文では Py...

チューリング学習:新世代のロボットは観察するだけで人間を模倣できる

[[187204]]最近、シェフィールド大学自動制御システム工学部のロデリッヒ・グロス博士は次のよう...

AIと宇宙技術が日常生活をどう改善するか

衛星から都市計画まで、人工知能の進歩は新たな洞察をもたらしています。 [[270081]]宇宙技術と...

ハイブリッドAIは企業がデータの価値を掘り出すための好ましい方法である

人工知能については、誰もがよくご存知だと思います。実際、人工知能には幅広い知識が含まれており、さまざ...