25. Design Circular Queue
10538 ワード
道しるべ の円形クラブをデザインします.
円形キューを実装する方法はいくつかありますが、ここでは最も一般的な方法アレイを使用して実装します. のレイアウトから見ると,空間再利用のプロトタイプ優位性も体現できる.
まず初期化すると、キューサイズkが入力値として受け入れられる. kの値はもちろん最大長のmaxlenです.
前のポインタはp 1,後のポインタはp 2とする. の両方の初期値は0です.
次に,要素を挿入するenQueue()演算を実現する.
後ポインタp 2の位置に値を入力し、ポインタを1つ前に移動させる.
ただし、母チューリップ(残り)の全長を用いて演算を行い、ポインタの位置が全長からずれないようにします.
backポインタの位置がNoneでない場合はfalseを返します.他の要素が存在する空間がいっぱいまたは正常ではないためです.
この実装deQueue()演算が行われた.
この問題で要求されるDeQueue()演算は、要素を取り出さずに削除のみを実行するように定義されます.
キューから要素を取り出します.問題の例に示すように、前はFront()で、後ろはRear()で、異なる演算として定義されます.
Noneをfrontポインタp 1の位置に入れて削除し、ポインタを1つ前に移動します.
次に であり,同様にモジュール化演算であり,最大長を超えない. 『Introtecoon to Algorithms』という本やリスト9-1で整理されているワシントン州立大学課程の資料首都コードを見ると、同じプロトタイプキューを実現すると同時に、DeQueue()は要素を削除するだけでなく、抽出も実行することが明らかになった.
後、enQueue()移動後ポインタ、Decue移動前ポインタ.
1.配列で解く
class MyCircularQueue:
def __init__(self, k: int):
self.q = [None] * k
self.maxlen = k
self.p1 = 0
self.p2 = 0
#enQueue(): rear포인터 이동
def enQueue(self, value: int) -> bool:
if self.q[self.p2] is None:
self.q[self.p2] = value
self.p2 = (self.p2 +1) % self.maxlen
return True
else:
return False
#deQueue(): front 포인터 이동
def deQueue(self) -> bool:
if self.q[self.p1] is None:
return False
else:
self.q[self.p1] = None
self.p1 = (self.p1 +1) % self.maxlen
return True
def Front(self) -> int:
return -1 if self.q[self.p1] is None else self.q[self.p1]
def Rear(self) -> int:
return -1 if self.q[self.p2 - 1] is None else self.q[self.p2 - 1]
#인덱스이기에 -1을 해준다.
def isEmpty(self) -> bool:
return self.p1 == self.p2 and self.q[self.p1] is None
def isFull(self) -> bool:
return self.p1 == self.p2 and self.q[self.p1] is not None
# Your MyCircularQueue object will be instantiated and called as such:
# obj = MyCircularQueue(k)
# param_1 = obj.enQueue(value)
# param_2 = obj.deQueue()
# param_3 = obj.Front()
# param_4 = obj.Rear()
# param_5 = obj.isEmpty()
# param_6 = obj.isFull()
円形キューを実装する方法はいくつかありますが、ここでは最も一般的な方法アレイを使用して実装します.
まず初期化すると、キューサイズkが入力値として受け入れられる.
前のポインタはp 1,後のポインタはp 2とする.
次に,要素を挿入するenQueue()演算を実現する.
後ポインタp 2の位置に値を入力し、ポインタを1つ前に移動させる.
ただし、母チューリップ(残り)の全長を用いて演算を行い、ポインタの位置が全長からずれないようにします.
backポインタの位置がNoneでない場合はfalseを返します.他の要素が存在する空間がいっぱいまたは正常ではないためです.
この実装deQueue()演算が行われた.
この問題で要求されるDeQueue()演算は、要素を取り出さずに削除のみを実行するように定義されます.
キューから要素を取り出します.問題の例に示すように、前はFront()で、後ろはRear()で、異なる演算として定義されます.
Noneをfrontポインタp 1の位置に入れて削除し、ポインタを1つ前に移動します.
次に
Enqueue(Q,x)
Q[Q.tail] = x
if Q.tail == Q.length
Q.tail = 1
else
Q.tail = Q.tail + 1
Dequeue(Q)
x = Q[Q.head]
if Q.head == Q.length
Q.head = 1
else
Q.head = Q.head + 1
return x
整理Reference
この問題について(25. Design Circular Queue), 我々は、より多くの情報をここで見つけました https://velog.io/@corone_hi/25.-Design-Circular-Queueテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol