キュー

問題3

キュークラスを定義する。
関数はenqueueとdequeueを持つ。
属性にqueuepointerと配列を持つ。
インスタンスを2つ生成。
それぞれ独立に生成されていることを確認できる。

キューの動き

[][][][]

enqueue 4
[4][][][]

enqueue 5
[4][5][][]

dequeue
[5][][][]

enqueue 3
[5][3][][]

キュー(リングバッファ)の動き

max_len:5
head:0
tail:-1
[][][][][]


enqueue: 7
head:0
tail:0
[7][][][][]

enqueue: 5
head:0
tail:1
[7][5][][][]

enqueue: 3
head:0
tail:2
[7][5][3][][]

dequeue
> 7
[][5][3][][]
head:1
tail:2

enqueue :12
head:1
tail:3
[][5][3][12][]

enqueue :25
head:1
tail:4
[][5][3][12][25]

dequeue
head:2
tail:4
[][][3][12][15]

enqueue :8
head:2
tail:0
[8][][3][12][15]
# この時、プリントする順番は2, 3, 4, 0番目の順

enqueue :9
head:2
tail:1
[8][9][3][12][15]

dequeue
> 3
[8][9][][12][15]
head:3
tail:1

dequeue
> 12
[8][9][][][15]
head:4
tail:1

dequeue
> 15
[8][9][][][]
head:0
tail:1

dequeue
> 8
[][9][][][]
head:1
tail:1

メソッドの動き

enqueue

処理

  • 末尾にデータを挿入する
  • 末尾の位置を更新する

例外処理

dequeue

処理

  • 先頭のデータを取り出す
    • 先頭のデータをprintする
    • 先頭のデータにNoneを代入する
  • 先頭の位置を更新する

例外処理

コード

class Queue:
    max_len = 5 # データ長を最大で10
    def __init__(self):
        self.data_list = [None] * self.max_len
        self.headpointer = 0
        self.tailpointer = -1

    def enqueue(self, x):
        # 配列の次の位置の値がNoneでなければ、Queueは満杯である
        if not self.data_list[(self.tailpointer+1)%self.max_len] is None:
            print('Queue is full.')
            return
        # tailpointerを一つ進める
        self.tailpointer = (self.tailpointer+1)%self.max_len
        # 配列の、tailpointerの位置にデータを挿入
        self.data_list[self.tailpointer] = x

    def dequeue(self):
        # 配列の、headpointerの値がNoneなら空である
        if self.data_list[self.headpointer] is None:
            print('Queue is empty.')
            return
        # 配列の、headpointerの位置のデータを出力
        num = self.data_list[self.headpointer]
        # 配列の、headpointerの位置をNoneで代入
        self.data_list[self.headpointer] = None
        # headpointerを一つ進める
        self.headpointer = (self.headpointer+1)%self.max_len

        # numを返す
        return num

    def output(self):
        # data_listのheadpointerからtailpointerまでの出力
        prtlist=[]
        # headとtail、どちらの位置が大きいかによって、forの範囲を変更する。
        if self.tailpointer < self.headpointer :
            # 最大長から先頭位置を引き、末尾位置を加える
            for_range = range(self.max_len-self.headpointer+self.tailpointer+1)
        else:
            # 末尾位置から先頭位置を引く
            for_range = range(self.tailpointer-self.headpointer+1)
        
        # headpointerからi番目のdatalistの値をprtlistに加える
        for i in for_range:
            prtlist.append(self.data_list[(i+self.headpointer)%self.max_len])
        print(prtlist)


# クラス スタックのインスタンスを2つ生成
queue1 = Queue()
queue2 = Queue()

# Stackの操作
while True:
    # 操作の対象を選択
    tar = input("Input target.[queue1:1, queue2:2]:")
    if tar == "1":
        tar_queue = queue1
    elif tar == "2":
        tar_queue = queue2
    else:
        continue

    # 操作の内容を選択
    ope = input("Input operation.[enqueue:1, dequeue:2]:")

    if ope == "1": # queueする
        cont = input("Input enqueue data:")
        tar_queue.enqueue(cont)
    elif ope == "2": # dequeueする
        ret_num = tar_queue.dequeue()
        if ret_num is None:
            # Noneならばスタックが空っぽ
            print("Queue is empty.")
        else:
            print(ret_num)
    else:
        continue

    # 操作の終了を尋ねる
    is_continue = input("Continue?[y/n]")
    if is_continue == "n":
        break

print("queue1")
queue1.output()
print("queue2")
queue2.output()
"""
ホゲホゲピロピロ
"""
Select a repo