[선형] Circular Queue

2024. 8. 4. 13:03·CS/Data Structure

❒ Description


Design Circular Queue 문제를 풀면서 알게된 Circular Queue에 대해 학습한다.

긱포기 Circular Queue 포스팅을 참고했다.

 

 

 

❒ Circular Queue란?


Circular-Q는 normal-Q의 확장 버전으로 다음과 같은 특징을 갖고 있다.

  • 마지막 요소(rear)와 첫 번째 요소(front)가 연결된 구조를 갖는다.
  • 이런 구조로 인해 Buffer-Ring이라고 부르기도 한다.
  • FIFO 원칙을 기반으로 한다.

 

 

❒ Operations of Circular-Q


1. Front

  • Q의 앞쪽 요소를 반환한다.

2. Rear

  • Q의 뒤쪽 요소를 반환한다.

3. enQueue(value)

  • 새로운 요소를 삽입할 때 사용한다.
  • 새로운 요소는 항상 rear 위치에 자리한다.

4. deQueue(value) 

  • 요소를 제거할 때 사용한다.
  • 항상 front 위치의 요소를 제거한다.

 

 

 

❒ Circular-Q 구현하기


Circualr-Q는 두 가지 방식(Array, Linked List)으로 구현할 수 있다. 

 

1. Array 사용

Design Circular Queue 문제를 풀 때 Array 방식을 사용함.

 


2. Linked List 사용

Linked Lista 방식으로 구현하기 위해서는 우선 Node 클래스를 만들어줘야 한다.

public class Node {
    private int val;
    private Node next;
    
    public Node(int val) {
    	this.val = val;
        this.next = null;
    }
}

 

 

다음으로는 `enQueue()`가 필요하다.

public void enQueue(int val) {
    Node n = new Node(val);
	if (isEmpty()) {
    	n.next = n;
    } else {
    	n.next = rear.next;
        rear.next = n;
    }
    rear = n;
}

 

 

마지막으로 `deQueue()`가 필요하다.

public void deQueue() {
    if (isEmpty()) {
    	throw new EmptyQueueException();
    }
    int popElement = rear.next.val;
    if (rear.next == rear) {
    	rear = null;
    } else {
    	rear.next = rear.next.next;
    }
    return popElement;
}

 

 

그 외의 메소드들은 다음과 같다.

public int peek() {
    if (isEmpty()) {
    	throw new EmptyQueueException();
    }
    return rear.next.val;
}
public boolean isEmpty() {
    return rear == null;
}

 

 

 

❒ Circular-Q는 어떻게 쓰이고 있을까?


 

1. Memory Management

Q의 마지막 부분에 도달하면 처음 부분으로 돌아와 빈자리를 채우기 때문에, 메모리를 효율적으로 사용할 수 있다.

 

2. Traffic System

Circular-Q를 사용하면 traffic-lights의 상태를 순환 시키면, 각 light가 반복적으로 켜질 수 있다.
예를 들어 4개의 신호등이 있다고 가정하면, Circular-Q를 사용하면 첫 번째 신호등이 켜진 후
두 번째, 세 번째, 네 번째 신호등이 차례로 켜지고 다시 첫 번째 신호등으로 돌아오는 식으로 제어할 수 있다.

 

3. CPU Scheduling

프로세스들이 차례재로 CPU에 할당되어 처리되므로 공평하게 CPU 시간을 배분할 수 있다.

 


 

이렇게 Circular-Q는 메모리 효율성을 높이고, 일정한 순환이 필요한 시스템에 매우 유용하게 사용된다.

 

 

 

'CS > Data Structure' 카테고리의 다른 글

[비선형] 균형 이진 탐색 트리  (0) 2024.12.11
[비선형] Hash Table  (0) 2024.08.09
[선형] Doubly-Linked List  (0) 2024.08.06
[비선형] Priority Queue  (0) 2024.08.06
README.md  (0) 2024.07.24
'CS/Data Structure' 카테고리의 다른 글
  • [비선형] Hash Table
  • [선형] Doubly-Linked List
  • [비선형] Priority Queue
  • README.md
gilbert9172
gilbert9172
gilbert9172 님의 블로그 입니다.
  • gilbert9172
    バックエンド
    gilbert9172
  • 전체
    오늘
    어제
    • All Categories (173)
      • 우테코 7기 (21)
        • 1주차 (8)
        • 2주차 (5)
        • 3주차 (6)
      • Langauge (4)
        • Java (3)
        • Kotlin (1)
      • Back-End (13)
        • SpringBoot (1)
        • Trouble Shooting (0)
        • Setup & Configuration (1)
        • SQL (3)
        • Redis (8)
      • Architecture (6)
        • Multi Module (1)
        • DDD (5)
      • CS (30)
        • Data Structure (6)
        • Operating System (0)
        • Network (12)
        • Database (10)
        • Design Pattern (2)
      • Algorithm (78)
        • 내용 정리 (18)
        • 문제풀이 (60)
      • DevOps (6)
        • AWS (5)
        • Git (1)
      • Front-End (1)
        • Trouble Shooting (1)
      • Project (6)
        • 페이스콕 (6)
      • Book (7)
        • 이벤트 기반 마이크로서비스 구축 (6)
        • 친절한 SQL 튜닝 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    binarysearch
    greedy
    Two-Pointer
    부분단조성
    Back-Tracking
    sliding-window
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gilbert9172
[선형] Circular Queue
상단으로

티스토리툴바