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

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

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

ブログ    
ブログ    
ブログ    

推薦する

顔認識の長所と短所:祝福か呪いか?

[[403037]]画像ソース: https://pixabay.com/images/id-32...

人工知能チュートリアル(I):基礎

今日、コンピュータサイエンスの分野の学生や実務家にとって、人工知能、データサイエンス、機械学習、ディ...

車載グレードの安全チップとチップ安全性テスト技術を1つの記事で理解する

世界の自動車産業におけるインテリジェンスと車両のインターネットの発展により、新時代の人々はますます便...

AIOps の 7 つの主要機能

企業ネットワークが進化し続け、特にデジタル ビジネス アプリケーションへの移行が進むにつれて、サービ...

「ブロックチェーン+人工知能」は医療金融やその他の応用シナリオに応用されています

最近、国家インターネット金融セキュリティ技術専門家委員会と上海振聯公司は共同で「ブロックチェーン+A...

...

量子コンピューティングとブロックチェーンの未来

量子コンピューティングはブロックチェーンを破壊するのか、それともより安全にするのか? 01 序文コン...

清華大学:過去10年間の人工知能の発展の概要:中国は急速な進歩を遂げ、その特許は世界の70%を占める

1. 急速な発展の10年1. 論文の発表状況<br /> 人工知能は過去10年間で急速に...

データサイエンスにおける ML+ と DL+ の時代へようこそ

企業のデジタル変革は、次々と熱狂の波をもたらしました。国際的な権威ある組織は、今後数年間の企業のデジ...

...

今年、AIがサイバーセキュリティに影響を及ぼす可能性がある3つの重要な方法

この記事では、超強力なソーシャル攻撃から AI 搭載 PC まで、AI が今年サイバーセキュリティを...

トランスフォーマーのメンバー8人全員がGoogleに亡命!最後の共著者は今月末に自身のビジネスを始めるために退社する。

トランスフォーマーのメンバー8人全員がGoogleから離脱した。 Googleの画期的なTransf...

アリババDAMOアカデミー、世界初のマルチソース地球観測データ分析AI EARTHをリリース

DAMOアカデミーは宇宙から地球を眺める新たな方法を発見しました!9月18日、2020年雲啓大会にお...

人工知能と機械学習がビジネスに及ぼす影響

[[400670]]人工知能と機械学習が今日のテクノロジー業界のあらゆる部分に影響を与えていることは...