스택, 큐


스택

그냥 후입 선출(Last-in First-out)의 자료구조이다.
파이썬에서는 별도의 모듈을 사용하지 않고 list를 스택으로 활용한다.

구현을 하자면 다음과 같다.

class Stack:
    def __init__(self):
        self.container = list()

    def empty(self):
        if not self.container:
            return True
        else:
            return False

    def push(self, data):
        self.container.append(data)

    def pop(self):
        if self.empty():
            return None
        return self.container.pop()

    def peek(self):
        if self.empty():
            return None
        return self.container[-1]

선입선출을 가지는 자료구조

Untitled 7.png

class Queue:
    def __init__(self):
        self.container = list()
        
    def empty(self):
        if not self.container:
            return True
        else:
            return False

    def enqueue(self, data):
        self.container.append(data)

    def dequeue(self):
        return self.container.pop(0)

    def peek(self):
        return self.container[0]

문제

스택에서 push pop 연산은 맨 뒤에서 일어나서 O(1)인데, queu는 dequeue연산은 맨 앞에서 일어나므로 O(n)을 갖는다.

원형큐

선형의 큐를 원형으로 사용하는 방법

Untitled 1 3.png

head와 tail을 가리키는 변수를 두어서 데이터를 이동시키는게 아니라 가리키는 변수를 -1함.

class CQueue:
    MAXSIZE = 10
    def __init__(self):
        self.container = [None for _ in range(CQueue.MAXSIZE)]
        self.front = 0
        self.rear = 0

		def is_empty(self):
        return self.front == self.rear:
		def is_full(self):
        return self.front == (self.rear+1)%MAXSIZE:
		def enqueue(self,item):
				if not self.is_full():
					self.rare=(self.rare+1)%MAXSIZE
					self.items[self.rear]=item
		def dequeue():
				if not self.is_empty():
					self.front=(self.front+1)%MAXSIZE
					return self.items[self.front]
		def peek():
				if not self.isEmpty():
					return self.items[(self.front+1)%MAXSIZE]