LIFO(FILO) 구조
STL의 STACK의 지원 함수::
PUSH- 스택에 값을 넣음
POP- 최근에 넣은 값을 리턴하고 삭제
TOP- 가장 최근값을 리턴
EMPTY - STACK이 비어있다면 TRUE 출력
/* 싱글링크드 리스트를 이용해 실제 사용되는 stl(standard template library) 스택과 동일하게 구현 - 2019/05/18 xtar.tistory */
#include<iostream>
using namespace std;
template <typename T>
class Node
{
public:
T value;
Node<T>* next = nullptr;
Node() {};
~Node() {};
};
template <typename T>
class Stack
{
private:
Node<T>* head;
Node<T>* tail;
public:
Stack() :head(nullptr), tail(nullptr) {}
~Stack() { }
void Push(T value);
T Pop();
bool isEmpty();
T Top();
};
int main()
{
Stack<int> stack;
stack.Push(1);
stack.Push(2);
stack.Push(3);
stack.Push(4);
stack.Push(5);
cout << stack.Top() << endl;
cout << stack.Pop() << endl;
cout << stack.Pop() << endl;
cout << stack.Pop() << endl;
cout << stack.Pop() << endl;
cout << stack.Pop() << endl;
cout << stack.Pop() << endl << endl;
}
template<typename T>
bool Stack<T>::isEmpty() //비어있으면 true를 리턴
{
return tail == nullptr ? true : false;
}
template<typename T>
T Stack<T>::Top()// 마지막에 들어온 노드의 값 리턴
{
return tail->value;
}
template<typename T>
void Stack<T>::Push(T _value)
{
Node<T>* node = new Node<T>;
node->value = _value;
//만약 머리의 포인터가 비어있으면 새 노드 지정
if (head == nullptr)
{
head = node;
tail = node;
}
else
{
tail->next = node;
tail = tail->next;
}
}
template<typename T>
T Stack<T>::Pop()
{
if(isEmpty()) // 만약 stack이 비어있으면
{
return -1;
}
else
{
Node<T>* ptr = head;
T value = head->value;
if (head == tail)
{
head = nullptr;
tail = nullptr;
delete(head);
}
else// 데이터가 하나가 아니면
{
while (ptr != nullptr)
{
//꼬리(top)값 삭제후 새 꼬리 대입
if (ptr->next == tail)
{
value = tail->value;
ptr->next = nullptr;
delete(tail);
tail = ptr;
break;
}
ptr = ptr->next;
}
return value;
}
return value;
}
}
'Algorithm (알고리즘) > 자료구조' 카테고리의 다른 글
C++ 스택을 이용한 트리 전위순회 (Tree C++ with Stack) (0) | 2019.12.29 |
---|---|
C++ 이진 탐색 트리 구현 ( Binary Search Tree C++) (0) | 2019.12.28 |
C++ 포인터를 이용한 트리 구현 (Pointer Binary Tree C++) (0) | 2019.12.24 |
C++ 링크드 리스트를 이용한 큐 구현 (Single Linked List Queue C++) (0) | 2019.12.23 |
C++ 싱글 링크드 리스트 구현 (Singly Linked List C++) (2) | 2019.04.21 |