What-is-queue.md


κ°œλ…


λ¨Όμ € μ§‘μ–΄ 넣은 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” FIFO(First In First Out)ꡬ쑰둜 μ €μž₯ν•˜λŠ” 방식

μš©μ–΄


  • Front : 첫 번째 데이터

  • Rear : κ°€μž₯ λ§ˆμ§€λ§‰ 데이터

    front, rear의 μ΄ˆκΉƒκ°’ : -1

μ—°μ‚°


  • FIFO - First In First Out

  • Enqueue : 데이터λ₯Ό μ‚½μž…ν•˜λŠ” λ™μž‘

    • add(item) item을 리슀트의 끝뢀뢄에 μΆ”κ°€

      • rear = rear + 1 ν›„ item μΆ”κ°€

  • Dequeue : 데이터λ₯Ό μ‚­μ œν•˜λŠ” λ™μž‘

    • remove : 리슀트의 첫 번째 ν•­λͺ©μ„ 제거

      • front = front + 1

  • peek : νμ—μ„œ κ°€μž₯ μœ„μ— μžˆλŠ” ν•­λͺ©μ„ λ°˜ν™˜

  • isEmpty : 큐가 λΉ„μ–΄μžˆμ„ λ•Œ trueλ₯Ό λ°˜ν™˜

    • (front == rear) ? True : False

  • isFull : rear = n - 1

μ’…λ₯˜


μ„ ν˜•

linearqueueimage
  • 1차원 λ°°μ—΄μ˜ ν˜•νƒœλ‘œ μ΄λ£¨μ–΄μ ΈμžˆμŠ΅λ‹ˆλ‹€.

ν™˜ν˜•

μ„ ν˜• 큐의 문제점 linearqueueproblemimage

  • front와 rear의 값이 계속 μ¦κ°€ν•˜κΈ° λ•Œλ¬Έμ— μ–Έμ  κ°€λŠ” λ°°μ—΄μ˜ 끝에 λ„λ‹¬ν•˜κ²Œ 되고 λ°°μ—΄μ˜ μ•žλΆ€λΆ„μ΄ λΉ„μ–΄μžˆλ”λΌλ„ μ‚¬μš©ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

  • λ”°λΌμ„œ 원(ν™˜)ν˜• 큐가 λ‚˜μ˜€κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

circularqueueimage
  • front μ•žμ˜ 남은 곡간을 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λŠ” μ„ ν˜•νμ˜ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ μ›ν˜•νλŠ” λ°°μ—΄μ˜ μ‹œμž‘κ³Ό 끝이 이어져 μžˆλŠ” κ²ƒμ²˜λŸΌ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ (rear+1)%arraysize의 ν˜•μ‹μœΌλ‘œ 포인터λ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.

κ΅¬ν˜„


μ„ ν˜•ν

class LinearQueue:
    def __init__(self):        
        self.front = -1
        self.rear = -1
    
    def create_queue(self, size):
        self.queue = list([0 for i in range(size)]) #python의 listλŠ” null값이 λ“€μ–΄κ°ˆ 수 μ—†κΈ° λ•Œλ¬Έμ— 0이 빈 값이라고 μƒκ°ν•˜μž

    def add(self, item):
        self.rear += 1
        self.queue[self.rear] = item
        
    def remove(self):
        self.front += 1
        self.queue[self.front] = 0

    def peek(self):
        return self.queue[self.rear]

    def isEmpty(self):
        if self.front == self.rear:
            return True
        return False

    def isFull(self):
        if self.rear == len(self.queue) - 1:
            return True
        return False

μ›ν˜• 큐

class CircularQueue:
    def __init__(self):
        self.front = -1
        self.rear = -1

    def create_queue(self, size):
        # python의 listλŠ” null값이 λ“€μ–΄κ°ˆ 수 μ—†κΈ° λ•Œλ¬Έμ— 0이 빈 값이라고 μƒκ°ν•˜μž
        self.queue = list([0 for i in range(size)])
        print(len(self.queue))

    def add(self, item):
        if self.isFull:
            print('배열이 κ½‰μ°ΌμŠ΅λ‹ˆλ‹€.')
        else:
            self.rear += 1
            if self.rear >= len(self.queue):
                self.rear %= len(self.queue)
            self.queue[self.rear] = item
        print(self.queue)
        print('front: {} rear: {}'.format(self.front, self.rear))

    def remove(self):
        if self.isEmpty:
            print('배열이 λΉ„μ—ˆμŠ΅λ‹ˆλ‹€.')
        else:
            self.front += 1
            if self.front >= len(self.front):
                self.front %= len(self.queue)
            self.queue[self.front] = 0
        print(self.queue)
        print('front: {} rear: {}'.format(self.front, self.rear))

    def peek(self):
        return self.queue[self.rear]

    def isEmpty(self):
        if self.front == self.rear:
            return True
        return False

    def isFull(self):
        if self.rear == len(self.queue) - 1:
            return True
        return False

μ‹€μ œ μ½”λ”©ν…ŒμŠ€νŠΈμ—μ„œλŠ” collections λͺ¨λ“ˆμ˜ dequeλ₯Ό μ‚¬μš©ν•˜μž!

from collections import deque

queue = deque()

# 리슀트의 append와 같은 λ™μž‘
queue.append()
# κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ›μ†Œ pop
queue.popleft()

print(queue) #λ¨Όμ € λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ 좜λ ₯
print(queue.reverse()) #λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ μ›μ†ŒλΆ€ν„° 좜λ ₯

Last updated