Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで連結リストを使ってキュー(Queue)データ構造を実装する方法

連結リスト(リンクリスト)を用いてキューのデータ構造を実装するには、要素を末尾に追加するメソッド(enqueue操作)と、先頭から要素を取り出して削除するメソッド(dequeue操作)を定義します。キューは「先入れ先出し(FIFO:First In, First Out)」という特性を持つデータ構造であり、最初に追加した要素が最初に取り出されます。

以下に、その実装例を示します。

サンプルコード

class Node:
   def __init__(self, data):
   self.data = data
   self.next = None

class Queue_structure:
   def __init__(self):
      self.head = None
      self.last = None

   def enqueue_operation(self, data):
      if self.last is None:
         self.head = Node(data)
         self.last = self.head
      else:
         self.last.next = Node(data)
         self.last = self.last.next

   def dequeue_operation(self):
      if self.head is None:
         return None
      else:
         val_returned = self.head.data
         self.head = self.head.next
         return val_returned

my_instance = Queue_structure()
while True:
   print('enqueue <value>')
   print('dequeue')
   print('quit')
   my_input = input('What operation would you like to perform ? ').split()

   operation = my_input[0].strip().lower()
   if operation == 'enqueue':
      my_instance.enqueue_operation(int(my_input[1]))
   elif operation == 'dequeue':
      dequeued = my_instance.dequeue_operation()
      if dequeued is None:
         print('The queue is empty.')
      else:
         print('The deleted element is : ', int(dequeued))
   elif operation == 'quit':
      break

実行結果

enqueue <value>
dequeue
quit
What operation would you like to perform ? enqueue 45
enqueue <value>
dequeue
quit
What operation would you like to perform ? enqueue 12
enqueue <value>
dequeue
quit
What operation would you like to perform ? dequeue
The deleted element is : 45
enqueue <value>
dequeue
quit
What operation would you like to perform ? quit

コードの解説

  • まず、ノードを表す「Node」クラスを作成します。このクラスは、格納するデータ(data)と次のノードへの参照(next)を持ちます。

  • 次に、キュー本体となる「Queue_structure」クラスを必要な属性とともに定義します。

  • 初期化用の「__init__」関数では、先頭要素を表す「head」と末尾要素を表す「last」を「None」に設定して初期化します。

  • 「enqueue_operation」メソッドは、キューの末尾に新しい値を追加するためのものです。キューが空の場合は新規ノードが先頭かつ末尾になり、そうでなければ既存の末尾ノードの後ろに接続します。

  • 「dequeue_operation」メソッドは、キューの先頭から値を取り出して削除し、その削除された値を返します。キューが空の場合は「None」を返します。

  • 「Queue_structure」クラスのインスタンスを生成します。

  • ユーザーに対して「enqueue」「dequeue」「quit」の3つの選択肢を提示します。

  • 「enqueue」を選ぶと、指定した値がキューに追加されます。

  • 「dequeue」を選ぶと、キューから先頭の要素が削除され、その値が表示されます。

  • 「quit」を選ぶと、ループを抜けてプログラムが終了します。

  • ユーザーの入力内容に応じて、対応する操作が実行され、その結果がコンソールに出力されます。


  1. Pythonで双方向連結リストを指定したNノード分回転させる方法

    双方向連結リスト(doubly linked list)を特定のノード数だけ回転させたい場合、まず「Node」クラスを作成する必要があります。このクラスには、ノードが保持するデータ、次のノードへの参照、前のノードへの参照という3つの属性を持たせます。 以下に具体的な実装例を示します。 サンプルコード class Node:     def __init__(self, my_data):         self.previous = None   &nb

  2. 循環リンクリスト内の要素を検索するPythonプログラム

    循環リンクリストとは循環リンクリスト(Circular Linked List)は、通常のリンクリストと異なり、最後のノードが先頭ノードに接続されているデータ構造です。そのため、リスト内に「NULL」で終わるノードが存在せず、head(先頭)とtail(末尾)が互いに隣接し、円を形成するように連結されています。循環リンクリスト内の特定の要素を検索するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードに格納されるデータと、次のノードへの参照という2つの属性を持たせます。さらに、初期化関数を持つ別のクラスを作成し、headノードを「None」で初期化します。そして、リスト