「データ構造」キューの基本概念と実装、スタック、比較(Python)



以下の内容とコードはこれらの教材に基づいて整理された文章です.😊

Queue


1.生活の中でQ


生活の中で、行列を説明するために銀行ATMから預金を引き出すことがある.先に並んだ人が先に金を引き出す.これをキューの形式と見なすことができます.

2.キューの概念


キューデータ構造は、입구および출구から分離された円柱形状と同じである.
前に学習したスタックFILO(またはLIFO:最初の出力)と比較する.スタックには1つのエントリしかありません.最初のエントリが最後に現れた構造であれば、キューには個別のエントリと出口があります.
前述したATM機の行、有名グルメ店の行列、列車がトンネルを出る順番など、先着順のFIFO(First In First Out)が特徴です.
💡 スタック:最初の最初のアウトバウンドまたは最初のアウトバウンド
  • 最初に入ったやつが最後に出てきた.一つ一つ積み上げられた円環形
  • 💡 ヒント:最初の入力最初の出力(FIFO)
  • 一番先に入った人が先に出てきます.列車がトンネルを出る順番と同じ
  • 3.Qの原理


    キューは両端に穿孔された構造であるため、1つのキューには데이터 삽입万個のキューしかなく、もう1つのキューには데이터 추출万個のキューしかありません.
    データ挿入動作をenQueueと呼び、逆にデータ抽出動作をdeQueueと呼ぶ.
    また、キューの重要な用語はfront(머리)rear(꼬리)である.
    データを挿入すると、hutの後に新しいデータ(hut+1の位置)が挿入され、データを抽出すると、最初に入力したデータが取り出されなければならないため、ヘッダ位置が抽出されます.
    💡 キュー内の用語:front、hut、enQueue、deQueue
    💡 スタック用語:top、bottom、push、pop

    1)データ挿入:enQueue


    5つのキュースペースが空です.
    すべてのキューが空の場合、前(ヘッダ)と後(テール)の値は同じで、-1でなければなりません.
    front = rear = -1
    データを挿入したら、backを右に1つ移動します.
    では、後ろの値は0でしょう.データは0個の位置に挿入されます.

    2)データ抽出:DeQueue


    キューからのデータの抽出は、左端からのデータの抽出と同じです.
    出口が1つしかないため、中間データを抽出することができず、一番左側のデータから抽出することができます.
    一番左側のデータが抽出された場合、一番前のデータを左側に移動することが考えられます.なぜなら、それらは空であるからです.
    この操作を実行しないと、前のスペースは空になり、後のスペースはそのままになります.ワークスペースがいっぱいだと勘違いしているため、データを挿入できません.

    (whiteboardで手動操作...画像が間違っている場合は、コメントで教えてください.)😂)

    4.単純実装キュー


    1)データ挿入:enQueue

    # 생성한 큐에 화사를 넣으려면 우선 rear를 1 증가 시킨 뒤, rear 위치에 데이터를 넣는다.
    
    queue = [None, None, None, None, None]  # 크기가 5인 빈 큐 준비
    front = rear = -1                       # 초깃값 설정
    
    rear += 1               # rear를 1 증가 시키며 데이터 삽입
    queue[rear] = '화사'
    rear += 1
    queue[rear] = '솔라'
    rear += 1
    queue[rear] = '문별'
    
    print('-----큐 상태-----')
    print('[출구]<--', end = ' ')
    for i in range(0, len(queue), 1):
        print(queue[i], end=' ')
    print('<--[입구]')
    出力結果
    -----큐 상태-----
    [출구]<-- 화사 솔라 문별 None None <--[입구]

    2)データ抽出:DeQueue

    # 데이터가 3개 있는 큐에서 데이터를 추출하려면 front를 1 증가시킨 후
    # front 위치의 데이터를 밖으로 추출하고 front 위치의 데이터는 None으로 만든다.
    
    queue = ['화사', '솔라', '문별', None, None]    # 테스트용 큐
    front = -1
    rear = 2
    
    # 데이터 추출 이전의 큐 상태 확인
    print("----큐 상태-----")
    print('[출구] <---', end = ' ')
    for i in range(0, len(queue)):
        print(queue[i], end=' ')
    print('<-- [입구]')
    print('----------------')
    
    front += 1                      # front 위치를 오른쪽으로 증가
    data = queue[front]             # 현재 front 위치의 데이터 추출
    queue[front] = None             # front에 None을 넣어서 데이터 삭제
    print('deQueue -->', data)      # 추출한 데이터 출력
    
    front += 1
    data = queue[front]
    queue[front] = None
    print('deQueue -->', data)
    
    front += 1
    data = queue[front]
    queue[front] = None
    print('deQueue -->', data)
    print('----------------')
    
    print("----큐 상태-----")
    print('[출구] <---', end = ' ')
    for i in range(0, len(queue), 1):
        print(queue[i], end=' ')
    print('<-- [입구]')
    出力結果
    ----큐 상태-----
    [출구] <--- 화사 솔라 문별 None None <-- [입구]
    ----------------
    deQueue --> 화사
    deQueue --> 솔라
    deQueue --> 문별
    ----------------
    ----큐 상태-----
    [출구] <--- None None None None None <-- [입구]