Design Circular Queue - LeetCode
class MyCircularQueue {
int[] arr;
int front;
int rear;
int n;
private final int INIT_NUMB = -1;
public MyCircularQueue(int k) {
arr = new int[k];
// -1로 초기화
Arrays.fill(arr,INIT_NUMB);
n = k;
front = 0;
rear = 0;
}
// rear를 움직인다.
public boolean enQueue(int value) {
// 먼저, full인지 확인
if(isFull()) return false;
// rear 에 값을 넣는다.
arr[rear] = value;
// rear 값을 업데이트 한다
rear = (rear+1)%n;
return true;
}
public boolean deQueue() {
// 먼저, empty인지 확인
if(isEmpty()) return false;
// front에 -1을 넣는다.
arr[front] = INIT_NUMB;
// front의 값을 업데이트 한다.
front = (front+1)%n;
return true;
}
public int Front() {
// empty인지 확인
if(isEmpty()) return -1;
return arr[front];
}
public int Rear() {
// empty인지 확인
if(isEmpty()) return -1;
if(rear == 0) return arr[n-1];
else return arr[rear-1];
}
public boolean isEmpty() {
if(arr[front] == INIT_NUMB) return true;
else return false;
}
public boolean isFull() {
if(arr[rear]!=INIT_NUMB) return true;
else return false;
}
}
Primitive type인 int의 배열로 구현하는 것을 생각했었다.
이 때의 문제점은 → Dequeue연산을 할 때, 값을 제거해 주는 부분이었다.
어쩔 수 없이, 문제조건에서, value의 범위가 아닌 값으로 덮어씌움으로서 제거한다는 표현을 했었다.
if front < rear : rear - front
else : max - front + rear
class MyCircularQueue:
def __init__(self, k: int):
self.q = [None]*k
self.maxlen = k
self.f = 0
self.r = 0
# rear 이동
def enQueue(self, value: int) -> bool:
# rear 자리가 비어있다면
if self.q[self.r] is None:
self.q[self.r] = value
self.r = (self.r + 1) % self.maxlen
return True
else:
return False
# front 이동
def deQueue(self) -> bool:
# front 가 비어있으면 False
if self.q[self.f] is None:
return False
else:
self.q[self.f] = None
self.f = (self.f + 1) % self.maxlen
return True
def Front(self) -> int:
return -1 if self.q[self.f] is None else self.q[self.f]
def Rear(self) -> int:
if self.isEmpty():
return -1
if self.r == 0:
return self.q[self.maxlen-1]
else:
return self.q[self.r-1]
# front가 비어있다면 -> Empty
def isEmpty(self) -> bool:
if self.q[self.f] is None:
return True
else:
return False
# Rear가 꽉 차있다면 -> Full
def isFull(self) -> bool:
if self.q[self.r] is None:
return False
else:
return True