Stack 전체 구조

Stack은 FIFO(First 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<T>* m_Next 변수는 다음으로 가는 변수의 주소를 담고 있습니다. 즉 위에서 부터 데이터를 꺼내므로 자신의 아래에있는 Node의 주소를 가르키며 T m_Data 변수는 데이터 값을 가지고 있습니다.
Stack
private: Node<T>* m_Top; public: Stack() { m_Top = nullptr; } ~Stack() { Node<T>* nodeMove = m_Top; while (nodeMove != nullptr) { Node<T>* temp = nodeMove; nodeMove = nodeMove->m_Next; delete temp; } }
멤버 변수로는 가장 위에있는 Node* 변수 하나만 가집니다. 생성자로 초기 데이터는 null로 하며 소멸자에서는 쌓여져 있던 stack의 모든 Node를 메모리 해제합니다.
데이터 push
void push(T data) { Node<T>* newNode = new Node<T>(data); newNode->m_Next = m_Top; m_Top = newNode; }
새로운 노드를 생성 해 매개변수로 받은 데이터를 넣어 둔 변수 newNode를 m_Next 주소를 현재 m_Top으로 한 후 m_Top 값을 newNode로 합니다
데이터 pop
T pop() { // 스택이 비었을때 if (m_Top == nullptr) { throw runtime_error("스택의 값이 비었습니다"); } else { T topData = m_Top->m_Data; Node<T>* temp = m_Top; m_Top = m_Top->m_Next; delete temp; return topData; } }
m_Top 변수에 m_Top 변수의 다음 노드를 가르키는 값을 저장하고 기존 m_Top 변수의 값을 담은 새로운 Node를 만들어서 리턴합니다.
데이터 top
T top() { if (m_Top == nullptr) { throw runtime_error("스택의 값이 비었습니다"); } else { return m_Top->m_Data; } }
가장 위에있는 Node의 데이터를 꺼내서 리턴 합니다.
데이터 print
void print() { Node<T>* moveNode = m_Top; cout << "stack 데이터 출력" << endl; while (moveNode != nullptr) { cout << moveNode->m_Data << " "; moveNode = moveNode->m_Next; } cout << endl; }
가장 위에서 부터 m_Next로 이동하면서 하나씩 데이터를 출력합니다.
'자료구조' 카테고리의 다른 글
Queue (0) | 2024.06.09 |
---|---|
Binary Tree (0) | 2024.06.07 |
Double Linked List (0) | 2024.06.01 |
Linked List (0) | 2024.05.28 |