Miner

Day03 본문

데브코스

Day03

MineTime76 2023. 10. 18. 16:02

1. 큐

선입선출(FIFO) 

양뱡향 연결 리스트로 구현

class Node:

    def __init__(self, item):
        self.data = item
        self.prev = None
        self.next = None


class DoublyLinkedList:

    def __init__(self):
        self.nodeCount = 0
        self.head = Node(None)
        self.tail = Node(None)
        self.head.prev = None
        self.head.next = self.tail
        self.tail.prev = self.head
        self.tail.next = None


    def __repr__(self):
        if self.nodeCount == 0:
            return 'LinkedList: empty'

        s = ''
        curr = self.head
        while curr.next.next:
            curr = curr.next
            s += repr(curr.data)
            if curr.next.next is not None:
                s += ' -> '
        return s


    def getLength(self):
        return self.nodeCount


    def traverse(self):
        result = []
        curr = self.head
        while curr.next.next:
            curr = curr.next
            result.append(curr.data)
        return result


    def reverse(self):
        result = []
        curr = self.tail
        while curr.prev.prev:
            curr = curr.prev
            result.append(curr.data)
        return result


    def getAt(self, pos):
        if pos < 0 or pos > self.nodeCount:
            return None

        if pos > self.nodeCount // 2:
            i = 0
            curr = self.tail
            while i < self.nodeCount - pos + 1:
                curr = curr.prev
                i += 1
        else:
            i = 0
            curr = self.head
            while i < pos:
                curr = curr.next
                i += 1

        return curr


    def insertAfter(self, prev, newNode):
        next = prev.next
        newNode.prev = prev
        newNode.next = next
        prev.next = newNode
        next.prev = newNode
        self.nodeCount += 1
        return True


    def insertAt(self, pos, newNode):
        if pos < 1 or pos > self.nodeCount + 1:
            return False

        prev = self.getAt(pos - 1)
        return self.insertAfter(prev, newNode)


    def popAfter(self, prev):
        curr = prev.next
        next = curr.next
        prev.next = next
        next.prev = prev
        self.nodeCount -= 1
        return curr.data


    def popAt(self, pos):
        if pos < 1 or pos > self.nodeCount:
            raise IndexError('Index out of range')

        prev = self.getAt(pos - 1)
        return self.popAfter(prev)


    def concat(self, L):
        self.tail.prev.next = L.head.next
        L.head.next.prev = self.tail.prev
        self.tail = L.tail

        self.nodeCount += L.nodeCount


class LinkedListQueue:

    def __init__(self):
        self.data = DoublyLinkedList()

    def size(self):
        return self.data.getLength()

    def isEmpty(self):
        return self.size() == 0

    def enqueue(self, item):
        node = Node(item)
        self.data.insertAt(self.size()+1, node)

	def dequeue(self):
        return self.data.popAt(1)

    def peek(self):
        return self.data.getAt(1).data

	def solution(x):
    	return 0

파이썬 Deque(Double Ended Queue)

  • 스택과 큐의 연산을 모두 지원하는 자료구조로, 양 끝에서 모두 삽입과 삭제가 가능한 큐
  • from collections import deque
  • d = deque([1,2,3])
  • d.append(5)
  • d.appendleft(6)
  • d.insert(2,9)
  • d.extend([9,8,7])
  • d.extendleft([1,2,3])
  • d.pop()
  • d.popleft()

큐의 활용

  • 자료를 생성하는 쪽과 이용하는 쪽이 비동기적으로 일어나는 경

2. 환형 큐

출처 : https://velog.velcdn.com/images%2Fillstandtall%2Fpost%2F5e2e6049-43d9-4611-a68e-a0b6422a6900%2F11_1.png

3. 우선순위 

'데브코스' 카테고리의 다른 글

DAY 08  (0) 2023.10.25
DAY 07  (0) 2023.10.24
DAY6 - 파이썬으로 웹 다루기  (1) 2023.10.23
DAY 2  (0) 2023.10.17
데브코스 1일차  (0) 2023.10.16