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 |