일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Algorithm
- PYTHON
- db
- Docker
- 트랜잭션
- redis
- CSS
- mysql
- nosql
- DFS
- 영속성 컨텍스트
- 완전탐색
- 알고리즘
- HTML
- 백준
- It
- java
- javascript
- 자료구조
- 플로이드-워셜 알고리즘
- 데이터베이스
- jpa
- 운영체제
- OS
- CS
- Data structure
- spring
- 프로그래머스
- BFS
- websocket
- Today
- Total
If at first you don't succeed, try again
[자료구조] Circular Queue(원형 큐)(Python) 본문
* 개요
Circular Queue(원형 큐)는 큐의 변형된 구조로서, 데이터를 넣는 부분(rear)과 데이터를 빼는 부분(front)을 포인터로 지정함으로써,enqueue와 dequeue를 하는 형태의 자료구조이다. 원형 큐에서 정해둔 큐의 크기보다 더 큰 경우(큐가 가득 찬 경우), 큐가 비어있을 경우에 포인터가 같은 위치를 지정하기 때문에 이를 해결하기 위해 한 공간을 비워놓는다.(None or Null)
* 파이썬으로 구현한 원형 큐
원형 큐를 리스트로 구현하였다.
MAX_SIZE = 5
class CircularQueue:
def __init__(self):
self.front = 0
self.rear = 0
self.queue = [None] * MAX_SIZE
def enqueue(self, data):
if self.isFull():
print("원형 큐가 꽉 찼음.")
else:
self.rear = (self.rear + 1) % MAX_SIZE
self.queue[self.rear] = data
def dequeue(self):
dequeue_data = None
if self.isEmpty():
print("원형 큐가 비어있음.")
else:
self.front = (self.front + 1) & MAX_SIZE
dequeue_data = self.queue[self.front]
return dequeue_data
def clear(self) :
self.front = self.rear
def peek(self):
peek_data = None
if self.isEmpty():
print("원형 큐가 비어있음.")
else:
peek_data = self.queue[(self.front + 1) % MAX_SIZE]
return peek_data
def isEmpty(self):
is_empty = False
if self.front == self.rear:
is_empty = True
return is_empty
def isFull(self):
is_full = False
if self.front == (self.rear + 1) % MAX_SIZE:
is_full = True
return is_full
def printQueue(self):
if self.front < self.rear :
print(self.queue[self.front + 1 : self.rear + 1])
else :
print(self.queue[self.front + 1 : MAX_SIZE] + self.queue[0 : self.rear + 1])
원형 큐의 크기(MAX_SIZE)를 5의 상수로 지정하였다.
__init__()은 원형 큐의 초기화 부분으로서 데이터를 추출하는 front, 데이터를 삽입하는 rear 부분을 모두 0으로 선언한다. 그 후, queue에 MAX_SIZE만큼 None을 대입하여 리스트를 선언한다.
enqueue()는 삽입 함수로, 원형 큐가 꽉 찼는지 여부를 확인하고, 큐가 가득 차지 않았다면
(rear의 인덱스 + 1) % MAX_SIZE 연산한 것을 rear에 대입한다. 그 후 변경된 rear 인덱스에 데이터를 추가해주면 된다.
dequeue()는 삭제 함수로, 원형 큐가 비어있는지 여부를 확인하고, 큐가 비어있지 않다면
(front의 인덱스 + 1) % MAX_SIZE 연산한 것을 front에 대입한다. 그 후 변경된 front 인덱스의 데이터를 반환한다.
clear()는 큐를 초기화하는 함수로, front의 인덱스를 rear의 인덱스로 바꿔준다. 이렇게 된다면 front == rear가 성립이 되고, 원형 큐의 기존의 인덱스에 새로운 데이터를 삽입할 수 있게 된다.
peek()는 큐의 front 인덱스의 데이터를 반환하는 함수로, 인덱스 변경은 이루어지지 않는다.
isEmpty() 함수는 큐가 비어있는지의 여부를 확인하는 함수로, front와 rear가 같다면 비어있는 것으로 간주한다.
isFull()함수는 큐가 데이터로 꽉 차 있는지의 여부를 확인하는 함수이다. 만약 front의 인덱스와 (rear + 1) % MAX_SIZE가 같다면 가득 찬 것으로 간주한다.
printQueue() 함수는 큐의 데이터를 출력하는 함수이다. 만약 front의 인덱스가 rear의 인덱스보다 작다면, front + 1의 인덱스부터 rear의 인덱스까지의 데이터를 출력한다. 그러나 front의 인덱스가 rear의 인덱스보다 크거나 같다면(초기화하였을 경우(clear) 또는 데이터 삽입과 삭제가 전혀 이루어지지 않은 초기 상태의 경우(init)), front + 1의 인덱스부터 MAX_SIZE 이전의 데이터 + 큐의 0 인덱스부터 rear의 인덱스의 데이터까지 출력한다.
'Computer Science > 자료구조(Python)' 카테고리의 다른 글
[자료구조] Hash Table(해시 테이블)(Python) (0) | 2022.11.10 |
---|---|
[자료구조] Deque(덱)(Python) (0) | 2022.11.07 |
[자료구조] Priority Queue(우선순위 큐)(Python) (0) | 2022.11.06 |
[자료구조] Queue(큐)(Python) (0) | 2022.11.04 |
[자료구조] Stack(스택)(Python) (0) | 2022.11.02 |