파이썬(python)의 자료구조

2. 파이썬의 큐와 스택

인공지능파이썬 2024. 10. 15. 16:38

 

1. 큐의 구조
- 가장 먼저 넣은 데이터를 가장 먼저 꺼낼수 있는 구조이다.
- 줄을 서는 행위와 유사
- FIFO(First-in First-out)
참고 사이트 : (https://visualgo.net/en/list)

1-1.큐의 용어 
- Enqueue : 큐에 데이터를 넣는 기능
- Dequeue : 큐에 데이터를 꺼내는 기능 

1-2. 큐의 사용
- 푸시 메시지(순서대로 발송)
- 멀티 태스킹을 위한 프로세스 스케줄링 방식을 구현(운영체제) 


1-3. 파이썬 Queue 라이브러리를 활용하여 Queue 자료구조를 사용
- Queue() : 가장 일반적인 큐 자료구조를 생성
- LifoQueue() : 나중에 입력된 데이터가 먼저 출력되는 구조의 큐 자료구조를 생성(스택 구조와 비슷)
- PriorityQueue() : 데이터마다 우선순위를 넣어서 우선순위가 높은순으로 데이터를 출력

예시

1)
import queue
data_queue = queue.Queue()
data_queue.put('Hello') # Enqueue
data_queue.put('Python')
data_queue.put('Hello')
data_queue.put('World')
print(data_queue)
print(data_queue.qsize())
print(data_queue.get()) # Dequeue
print(data_queue.qsize())

-->
<queue.Queue object at 0x79c1310d5f30>
4
Hello
3


2)
for i in range(data_queue.qsize()):
    print(data_queue.get())
    
-->
Python
Hello
World


3)
# LifoQueue()로 큐 만들기
data_queue = queue.LifoQueue()
data_queue.put('Hello')
data_queue.put('Python')
data_queue.put('Hello')
data_queue.put('World')
print(data_queue.qsize())
print(data_queue.get())

-->
4
World


4)
# PriorityQueue()로 큐 만들기
data_queue = queue.PriorityQueue()
data_queue.put((10, '김사과')) # 키값이 작을수록 우선순위가 높음
data_queue.put((5, '반하나'))
data_queue.put((7, '오렌지'))
data_queue.put((2, '이메론'))
data_queue.put((8, '채리'))
print(data_queue.qsize())
print(data_queue.get())
print(data_queue.get())

-->
5
(2, '이메론')
(5, '반하나')


문제1
리스트 변수로 큐를 다루는 enqueue, dequeue 기능을 구현해보자

queue_list = list()

def enqueue(data):
    queue_list.append(data)

def dequeue():
    data = queue_list[0]
    del queue_list[0]
    return data


print(len(queue_list))
for index in range(10):
    enqueue(index)
-->
0


print(len(queue_list))
print(queue_list)
-->
10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(dequeue())
-->
0
print(dequeue())
-->
1
print(queue_list)
-->
[2, 3, 4, 5, 6, 7, 8, 9]

 

2. 스택의 구조
- 가장 나중에 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조
- 한쪽 끝에서만 자료를 넣거나 뺼 수 있는 구조
- LIFO(Last-in, First-out)

2-1. 스택의 용어
- push : 데이터를 스택에 쌓기
- pop : 데이터를 스택에서 꺼내기


2-2.스택의 사용
- 컴퓨터 내부의 프로세스 구조의 함수 동작 방식


### 2-3. 큐와 스택의 장단점
* 장점
    * 구조가 단순해서 구현하기 쉬움
    * 데이터 저장/읽기 속도가 빠름
* 단점
    * 데이터 최대 개수를 미리 정해야 함 -> 스택: 파이썬의 경우 재귀함수는 1000번까지만 호출이 가능
    * 저장 공간의 낭비가 발생할 수 있음 -> 미리 최대 개수만큼 저장공간을 확보해야 함

> 스택과 큐는 단순하고 빠른 성능을 위해 사용하므로 보통 배열 구조를 활용해서 구현하는 것이 일반적


# 파이썬 리스트 기능에서 제공하는 메소드로 스택 사용하기
data_stack = list()
print(data_stack)
-->
[]

data_stack.append(2)
data_stack.append(10)
data_stack.append(4)
data_stack.append(8)
print(data_stack)

-->
[2, 10, 4, 8]

data_stack.pop()
print(data_stack)

-->
[2, 10, 4]


#문제2
* 리스트 변수로 스택을 다루는 pop, push 기능을 직접 구현해보자
* 단, 리스트의 pop, push 함수는 사용하지 않음

stack_list = list()

def push(data):
    stack_list.append(data)

def pop():
    data = stack_list[-1]
    del stack_list[-1]
    return data

for index in range(10):
    push(index)

print(stack_list)
-->
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(pop())
print(pop())
print(pop())
-->
9
8
7

print(stack_list)
-->
[0, 1, 2, 3, 4, 5, 6]

 

728x90
LIST

'파이썬(python)의 자료구조' 카테고리의 다른 글

6. 트리  (0) 2024.10.21
5. 파이썬의 해시 테이블  (2) 2024.10.18
4. 파이썬의 더블 링크드 리스트  (2) 2024.10.15
3. 파이썬의 링크드 리스트  (0) 2024.10.15
1. 파이썬의 자료 구조  (0) 2024.10.15