본문 바로가기

자료구조

Stack

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