循環配列を用いたキューの実装
概要
キュー(Queue)は先入れ先出し(First In First Out)を実現するためのデータ構造です。無限の長さを持つ配列があれば末尾に要素を追加していくだけでキューを実装できますが、実際には有限長の配列でキューを実装する必要があります。有限長の配列に要素を追加する際、配列の末尾がすでに埋まっていたら配列の先頭から格納していく必要があるため、剰余算術を用いて格納位置を決定します。下記に実装例を示します。
実装例
class MyCircularQueue(object):
def __init__(self, k):
# サイズkの配列を用いてキューを実装する
self.k = k
self.q = [None] * k
self.first = 0 # 要素の先頭を表すindex
self.last = 0 # 要素の末尾を表すindex
# キューの末尾にデータを追加する
def enQueue(self, value):
if self.isFull():
return False
else:
# 剰余をindexとして返す
idx = self.last % self.k
self.q[idx] = value
self.last += 1
return True
# キューの先頭からデータを取り出す
def deQueue(self):
if self.isEmpty():
return None
else:
# 剰余をindexとして返す
idx = self.first % self.k
val = self.q[idx]
self.q[idx] = None
self.first += 1
return val
# キューの先頭のデータを参照する
def front(self):
idx = self.first % self.k
return self.q[idx]
# キューの末尾のデータを参照する
def rear(self):
idx = (self.last - 1) % self.k
return self.q[idx]
# キューが空かどうか判定する
def isEmpty(self):
return self.first == self.last
# キューが一杯かどうか判定する
def isFull(self):
return self.last - self.first == self.k
注意点
本来はキューが一杯になったら配列の長さを拡張する等の対応を行うことが望ましいですが、本記事では簡略化のため省略しています。
参考
Author And Source
この問題について(循環配列を用いたキューの実装), 我々は、より多くの情報をここで見つけました https://qiita.com/maebaru/items/fb640c16733301f836f7著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .