알고리즘&자료구조

자료구조 - stack and Queue

best_spear_man 2023. 8. 1. 03:19

Stack

Stack은 삽입과 삭제를 한쪽 끝(top)에서만 할 수 있도록 제한된 선형 자료구조이다. 자료를 넣으면(push), 꺼낼 때(pop)는 반대의 순서로 나오게 된다. (후입선출, LIFO)

stack의 활용

stack은 다음과 같을 때 주로 사용된다.

1. '최근에 임시저장한' 데이터를 가장 먼저 활용:
함수의 안에서 선언되는 매개변수,지역변수들은 스택에 저장된다.
함수가 끝나면 메모리에서 변수가 사라져야한다. 스택에 저장했으므로 바로 최근에 저장된 것들을 팝 하면 된다.

2. 쌍을 맞추기:
문자열에 주어진 괄호가 쌍이 맞는지 검사
'(':push
')':pop
문자열이 끝나고 stack에 남은 것이 있거나 빈 stack에서 pop하는 경우에는 쌍이 맞지 않는다는 것이다.
3. 뒤로 가기 기능:
웹페이지, 컨트롤제트, 그래프탐색에서 뒤로가기 등에 활용

stack 구현

# in python, stack and queue are made with list
class Stack:
    def __init__(self):
        self.items = list()
    # check list is empty
    def is_empty(self):
        return self.items == []
    # 넣기
    def push(self, item):
        self.items.append(item)
    # 가장 최근에 삽입된 자료 꺼내기
    def pop(self):
        if self.is_empty():
            return None
        return self.items.pop(-1)
    # 가장 최근에 삽입된 자료 확인
    def top(self):
        if self.is_empty():
            return None
        return self.items[-1]
    # 현재 입력된 자료 갯수 출력
    def size(self):
        return len(self.items)
    # 전체 비우기
    def empty(self):
        while self.pop():
            True

Queue

삽입과 삭제를 정해진 반대쪽 양끝에서만 할 수 있도록 제한된 선형 자료구조이다. 자료를 넣으면(enqueue), 꺼낼 때(dequeue)는 넣은 순서로 나오게 된다. (선입선출, FIFO)

Queue 활용

큐는 대기열, 버퍼등을 구현하는데 사용된다. 또한 스케쥴링 알고리즘을 만들 때 쓰인다.

Queue 구현

# in python, stack and queue are made with list
class Stack:
    def __init__(self):
        self.items = list()
    # check list is empty
    def is_empty(self):
        return self.items == []
    # 넣기
    def push(self, item):
        self.items.append(item)
    # 가장 먼저 삽입된 자료 꺼내기
    def pop(self):
        if self.is_empty():
            return None
        return self.items.pop(0)
    # 가장 먼저 삽입된 자료 확인
    def front(self):
        if self.is_empty():
            return None
        return self.items[0]
    # 가장 최근 삽입된 자료 확인
    def rear(self):
        if self.is_empty():
            return None
        return self.items[-1]
    # 현재 입력된 자료 갯수 출력
    def size(self):
        return len(self.items)
    # 전체 비우기
    def empty(self):
        while self.dequeue():
            True