본문 바로가기

자료구조

Queue

Queue 전체 구조

LIFO(Last In First Out) 구조로 먼저 들어간 데이터가 먼저 추출되는 구조를 가집니다.

Node

template <typename T>
class Node { // 노드 클래스
public:
    Node<T>* m_Next;
    T m_Data;

public:
    Node() {
        m_Next = nullptr;
    };
    Node(const T& data) {
        m_Data = data;
        m_Next = nullptr;
    };
    ~Node() {
        m_Next = nullptr;
    }
};

Node* m_Next 변수는 다음으로 가는 변수의 주소를 담고 있습니다. 즉 아래에서부터 데이터를 꺼내므로 자신의 위에있는 Node의 주소를 가르키며 T m_Data 변수는 데이터 값을 가지고 있습니다.

Queue

template <typename T>
class Queue {
private:
    Node<T>* m_Front; // 앞
    Node<T>* m_Back; // 뒤

public:
    Queue() {
        m_Front = nullptr;
        m_Back = nullptr;
    }
    ~Queue() {
        Node<T>* moveNode = m_Front;
        while (moveNode != nullptr) {
            Node<T>* temp = moveNode;
            moveNode = moveNode->m_Next;
            delete temp;
        }
    }

Node<T>* m_Front 변수는 현재 데이터들 중에서 가장 먼저 들어온 노드의 주소값을 가지고 있고 Node* m_Back 변수는 가장 마지막에 들어온 노드의 주소값을 가지고 있습니다. 생성자에서는 null로 초기화 하고 소멸자에서는 노드를 하나씩 메모리 해제 합니다.

Node Push

 void push(T data) {
        Node<T>* newNode = new Node<T>(data);
        if (m_Back == nullptr) {
            m_Front = newNode;
        }
        else {
            m_Back->m_Next = newNode;
        }
        m_Back = newNode;
    }

매개변수로 받은 데이터를 가진 새로운 노드를 만듭니다. 만약 큐가 비어 있다면 m_Front에 새로운 노드의 주소를 가르키고 큐기 비어있지 않다면 기존 m_Back과 새로운 노드의 주소를 m_Next로 연결하고 m_Back에 새로운 주소를 가르키게 합니다.

Node Pop

 T pop() {
        if (m_Front == nullptr) {
            throw runtime_error("큐가 비어 있습니다.");
        }
        else {
            T data = m_Front->m_Data;

            Node<T>* temp = m_Front;
            m_Front = m_Front->m_Next;
            delete temp;

            if (m_Front == nullptr) {
                m_Back = nullptr;
            }

            return data;
        }
    }

m_Front에서 데이터를 꺼낸 후 m_Front가 가르키는 주소를 큐 위에 있는 노드의 주소로 옮기고 기존 m_Front의 메모리를 해제합니다.

Node Front

 T front() {
        if (m_Front == nullptr) {
            throw runtime_error("큐가 비어 있습니다.");
        }
        else {
            return m_Front->m_Data;
        }
    }

m_Front의 데이터를 꺼내서 return 합니다.

Node isEmpty

 bool isEmpty() {
        if (m_Front == nullptr) {
            return true;
        }
        else {
            return false;
        }
    }

m_Front가 null이면 true 아니면 false를 리턴합니다.

Node print

void print() {
        Node<T>* moveNode = m_Front;
        cout << "queue 데이터 출력" << endl;
        while (moveNode != nullptr) {
            cout << moveNode->m_Data << " ";
            moveNode = moveNode->m_Next;
        }
        cout << endl;
    }

큐의 맨 아래 node부터 m_Next지역 변수를 이용해서 하나씩 위로 올라가면서 data 값을 출력합니다.

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

Stack  (0) 2024.06.07
Binary Tree  (0) 2024.06.07
Double Linked List  (0) 2024.06.01
Linked List  (0) 2024.05.28