[Data Structure] 스택(stack), 큐(Queue)
2022. 11. 10. 21:42ㆍ알고리즘/자료구조
[Data Structure] 스택(stack), 큐(Queue)
이전에는 stack과 queue에 대해 해당 자료구조의 기본적인 개념을 알고 문제풀이에 사용했다면 이번에는 해당 자료구조의 구현을 통해 해당 자료구조에 대해 좀 더 알아보았다. 파이썬에서는 리스트 자료구조를 통해 스택과 큐를 둘 다 쉽게 구현 가능했었지만 그것에 의존하지 않고 해당 자료구조를 알아보는 시간을 가질 수 있었다.
큐와 스택을 구현하는 방법에는 배열과 연결리스트가 존재한다. 이때 구현에 관해 각자의 사용 장단점부터 살펴보았다.
- 배열
- 배열의 인덱스를 사용하여 편리하게 사용한다는 장점
- 원하는 데이터가 어디있는지 위치를 파악할 수 있는것
- 크기가 정해져있기에 고정배열 사용 시 주기적으로 크기를 살펴봐야한다
- 배열의 인덱스를 사용하여 편리하게 사용한다는 장점
- 연결 리스트
- 노드 / 연결리스트의 방식으로 구현
- 스택의 크기에 제한이 없다 → 연결리스트의 장점
- 원소 삽입 및 삭제에 강점을 보임
스택(stack)
문제풀이에 자주 사용이 되는 스택이다. 스택의 특징들을 한번 살펴보자
- 후입선출(Last in First Out)의 구조
- 가장 늦게 들어온 작업을 먼저 처리하는 상황에서는 유용하다.
- 다만 해당 작업을 진행하던 중 아래에 있는 데이터를 가져오려면 위에 있는 데이터를 처리해야한다
- 프링글스 구조: 나중에 들어온 감자칩부터 입으로 들어온다
- 빨래 바구니
- 인터넷 브라우저의 뒤로가기 메서드
- 페이지가 넘어가면서 기존의 페이지는 쌓여진 페이지 가장 위에 존재
- 가장 늦게 들어온 작업을 먼저 처리하는 상황에서는 유용하다.
스택의 주요 메서드
- push : data를 입력받아서 스택 안에 데이터를 넣어주는 메서드
- pop : 가장 위에 존재하는 데이터를 뽑아내는 메서드
- peek : 가장 위에 존재하는 데이터를 보여주는 메서드
연결리스트로 구현이 된 스택
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Stack:
def __init__(self):
self.head = None
def push(self, value):
new_head = Node(value)
new_head.next = self.head
self.head = new_head
# pop 기능 구현
def pop(self):
if self.is_empty():
return "Stack is Empty"
delete_head = self.head
self.head = self.head.next
return delete_head.data
def peek(self):
if self.is_empty():
return "Stack is Empty"
return self.head.data
# isEmpty 기능 구현
def is_empty(self):
return self.head is None
stack = Stack()
print(stack.is_empty())
stack.push(5)
print(stack.peek())
stack.push(3)
stack.push(52)
print(stack.peek())
stack.push(51)
print(stack.pop())
파이썬에서 스택 사용
stack = []
stack.append(5)
stack.pop()
스택의 사용 알고리즘
- DFS ( 깊이 우선 탐색 )
- 해당 알고리즘은 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
큐(Queue)
스택과 마찬가지로 문제풀이에 자주 사용이 되는 큐 자료구조이다. 큐의 특징들을 한번 살펴보자
- 선입선출(First in First Out)의 구조
- 가장 먼저 들어온 데이터를 먼저 처리하므로 공정한 자료구조이다
- 대기줄
- 한쪽에서는 데이터의 삽입이 이루어지고 다른 한쪽은 데이터의 추출만 이루어짐
큐 메서드
- enqueue : 맨 뒤에 데이터 추가하기 메서드
- dequeue : 맨 앞의 데이터 뽑기 메서드
- peek : 맨 앞의 데이터 보기 메서드
연결리스트로 구현이 된 스택
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Queue:
def __init__(self):
self.head = None
self.tail = None
# 맨 뒤에 데이터 추가하기
def enqueue(self, value):
new_node = Node(value)
if self.is_empty(): # 만약 비어있다면,
self.head = new_node # head 에 new_node를
self.tail = new_node # tail 에 new_node를 넣어준다.
return
self.tail.next = new_node
self.tail = new_node
# 맨앞 데이터 뽑기
def dequeue(self):
if self.is_empty():
return "Queue is Empty"
delete_head = self.head
self.head = self.head.next
return delete_head.data
# 맨 앞의 데이터 보기
def peek(self):
if self.is_empty():
return "Queue is Empty"
return self.head.data
# 큐가 empty 여부 확인
def is_empty(self):
return self.head is None
queue = Queue()
queue.is_empty()
queue.enqueue(3)
print(queue.peek())
queue.dequeue()
queue.enqueue(34)
print(queue.peek())
queue.enqueue(35)
print(queue.peek())
파이썬에서 큐 사용
queue = []
queue.append(5)
queue.popleft()
큐 사용 알고리즘
- BFS ( 너비 우선 탐색 )
- 해당 알고리즘은 그래프에서 가까운 노드부터 탐색을 하는 알고리즘
'알고리즘 > 자료구조' 카테고리의 다른 글
[Data Structure] Linked List - 링크드 리스트 (0) | 2022.11.09 |
---|