개발공부/알고리즘
QUEUE
개발집사
2022. 9. 20. 11:23
FIFO(First In First Out)
티켓을 사려고 줄을 서서 기다리는 모습, 고속도로를 통과하는 자동차들과 같이 먼저 들어간 자료가 먼저 나오게 됩니다.
Queue의 특징
1.FIFO
2. 데이터는 하나씩 넣고 뺄 수 있습니다.
3. 두개의 입출력 방향을 가지고 있습니다.
=>가장 앞에 있는 데이터를 꺼내오기 때문에 그 다음 인덱스의 데이터들을 한 칸씩 모두 이동해야 하는 단점이 ㅇㅆ다.
Queue의 사용처
컴퓨터와 연결된 프린터의 인쇄
컴퓨터 장치들 사이에어 데이터를 주고받을 때, 각 장치 사이에 존재하는 속도의 차이나 시간의 차이를 극복하기위해 임시 기억장치의 자료구조로 Queue를 사용. 이것으 통틀어 버퍼(buffer)라고 한다.
++원형 큐(Circular Queue)
원형 큐는 선형큐의 문제점을 보완하기 위한 자료구조.
인덱스 변수가 front, rear 두개 존재.
원형 큐에 데이터 추가하기
데이터가 하나 추가되면 front는 변함없고, rear의 값이 늘어난다.
front=0 rear=0 => front=0, rear=1
원형 큐에 데이터 삭제하기
데이터가 하나 삭제되면 front가 하나 추가되고, rear의 값은 변함없다.
front=0, rear=3 => front=1, rear=3
원형 큐에 데이터가 최대로 저장된 경우
이 경우는 front와 rear의 인덱스 차이가 한 칸만큼 날때이다.
if(남은 한칸에 데이터를 저장) { rear === front}
하지만 front === rear 일경우, 원형 큐가 비어 있는 것으로 간주하기 때문에 빈건지 찬건지 구분이 불가능해진다.
※나머지 연산자(%) 활용하기: 데이터 추가, 삭제
max_len = 8 일때, 데이터 세개를 빼고 하나를 추가하는 상황이라면?
front = 0, rear = 7 => front = 3, rear = 7 => ??
rear = (rear+1) % max_len;
데이터의 개수를 구하는 방법
front < rear 일 때
count = rear - front;
front > rear 일 때
count = (rear - front) + MAX_LEN;
모든 상황을 만족 시킬 수 있는 수식
count = ((rear - front + 1) + MAX_LEN) % MAX_LEN;