[자료구조] 큐

2023. 5. 10. 18:49·전공/자료구조
728x90
반응형

큐(queue)

- 한쪽 끝에서 삽입이 일어나고 반대쪽 끝에서 삭제가 일어나는 순서 리스트

- 선입선출(FIFO, Firest-In-First-Out) 리스트

  • 새로운 원소가 삽입되는 끝 - rear
  • 원소가 삭제되는 끝 - front

 

큐의 구현

1차원 배열 이용

더보기

1. 큐의 첫 번째 원소를 queue[0]로 표현한 큐

- 삭제: queue[0] 원소를 제거
- 삭제 후 나머지 원소들을 왼쪽으로 이동해야 함 → 시간복잡도 - O(n)

비효율적

 

2. 큐의 첫번째 원소를 queue[front]로 표현한 큐

- 변수 fornt를 사용하여 큐의 첫번째 위치를 항상 유지
- 삭제: 시간복잡도 - Θ(1)
- 큐의 원소: queue[fornt], ..., queue[rear]

- 배열 queue의 크기가 capacity일 경우, rear = capacity-1이고 front > 0일 때 문제 발생

원형 큐

- 큐가 배열의 끝에서 되돌아오게 함
- 변수 fornt는 큐에서 첫 원소의 위치보다 시계반대 방향으로 하나 앞 위치를 가리킴
- 변수 rear는 큐에서 마지막 원소의 위치를 가리킴

- 모든 배열 위치는 직전 위치와 다음 위치를 가짐
→ capacity-1의 다음 위치는 0, 0의 직전 위치는 capacity-1

- 원형 큐의 동작을 위해 front와 rear를 시계 방향으로 이동시킴

if (rear == capacity - 1) rear = 0;
else rear++;
template <class T>
class Queue
{ // 0이상의 원소가 있는 유한 순서 리스트
private:
    T *queue;     // 큐 원소를 위한 배열
    int front,    // 원소가 삽입되는 끝
        rear,     // 원소가 삭제되는 끝
        capacity; // 큐 배열의 크기
public:
    Queue(int queueCapacity = 10);
    // 초기 용량이 queueCapacity인 빈 큐 생성

    bool IsEmpty() const;
    // 큐의 원소 수가 0이면 true를 반환, 그렇지 않으면 false를 반환

    T &Front() const;
    // front 원소 반환

    T &Rear() const;
    // rear 원소 반환

    void Push(const T &item);
    // rear에 원소 삽입

    void Pop();
    // front의 원소 삭제
};

 

큐의 함수 구현

emplate <class T>
inline bool Queue<T>::IsEmpty() { return front == rear; }

template <class T>
inline T &Queue<T>::Front()
{
    if (IsEmpty())
        throw "Queue is empty. No front element";
    return queue[(front + 1) % capacity];
}

template <class T>
inline T &Queue<T>::Rear()
{
    if (IsEmpty())
        throw "Queue is empty. No rear element";
    return queue[rear];
}

template <class T>
void Queue<T>::Push(const T &x)
{ // queue의 rear에 x를 더함
    if ((rear + 1) % capacity == front)
    { // queue가 꽉 찼을 때, capacity(용량)를 2배로 늘림
        T *newQueue = new T[2 * capacity]; 
        // 크기가 2배인 새로운 큐 생성

        // 새로운 큐에 기존 큐를 복사
        int start = (front + 1) % capacity;
        if (start < 2)
            // 큐가 인덱스 0부터 채워져 있을 때
            copy(queue + start, queue + start + capacity - 1, newQueue);
        else
        {   // 큐가 인덱스 0부터 채워져 있지 않을 때
            copy(queue + start, queue + capacity, newQueue);
            copy(queue, queue + rear + 1, newQueue + capacity - start);
        }

        // 새로운 큐로 대체
        front = 2 * capacity - 1;
        rear = capacity - 2;
        capacity *= 2;
        delete[] queue;
        queue = newQueue;
    }
    rear = (rear + 1) % capacity;
    queue[rear] = x;
}

template <class T>
void Queue<T>::Pop()
{ // 큐의 원소를 삭제
  if (IsEmpty()) throw "Queue is empty. Cannot delete.";
  front = (front + 1) % capacity;
  queue[front].~T(); // T의 소멸자
}
728x90
반응형

'전공 > 자료구조' 카테고리의 다른 글

[자료구조] 미로 문제  (1) 2023.05.10
[자료구조] 템플릿 함수, 컨테이너 클래스(Bag), C++의 서브타입과 상속  (0) 2023.05.10
[자료구조] 스택  (0) 2023.05.08
[자료구조] 스트링 타입, 스트링 패턴 매치(KMP 알고리즘), 실패함수  (2) 2023.05.06
[자료구조] 희소 행렬, 행렬 전치  (5) 2023.05.04
'전공/자료구조' 카테고리의 다른 글
  • [자료구조] 미로 문제
  • [자료구조] 템플릿 함수, 컨테이너 클래스(Bag), C++의 서브타입과 상속
  • [자료구조] 스택
  • [자료구조] 스트링 타입, 스트링 패턴 매치(KMP 알고리즘), 실패함수
dev_ares
dev_ares
대학에서 컴퓨터공학을 전공하고 있는 학생입니다.
    반응형
    250x250
  • dev_ares
    노트
    dev_ares
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • IT 트랜드 (2)
      • 백엔드 (18)
        • Java + Spring (8)
        • Kotlin + Spring (5)
        • 백엔드 (5)
      • 프론트엔드 (1)
        • React (1)
      • 대외활동 (17)
        • 42서울 (17)
      • 백준 (6)
        • Java (2)
        • C++ (3)
      • 전공 (121)
        • 객체지향프로그래밍 (17)
        • 자료구조 (23)
        • 리눅스시스템관리 (16)
        • 컴퓨터구조 (25)
        • 네트워크 (25)
        • 데이터베이스 (15)
        • 기타 전공 (0)
      • 프로그래밍 언어 (18)
        • Java (5)
        • Swift (4)
        • C++ (1)
        • Kotlin (8)
      • 기타 (4)
      • 공군 (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    42서울
    사설 문제
    반복자
    티스토리챌린지
    백준
    코틀린
    데이터패스
    컴퓨터구조
    오블완
    상속
    추가 문제
    단일 사이클
    명령어
    C++
    컴공 포트폴리오
    컴퓨터 구조 및 설계
    자바
    자료구조
    메모리 계층 구조
    리눅스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
dev_ares
[자료구조] 큐
상단으로

티스토리툴바