자료구조

Stack

Honyack 2023. 11. 13. 12:19

 

스택(stack)

스택(stack)은 제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다. 끝먼저내기 목록(Pushdown list)이라고도 한다.

스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있다. 자료를 넣는 것을 '밀어넣는다' 하여 푸쉬(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 (pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 푸쉬한 자료부터 나오게 된다. 이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 한다.

 

스텍 구조

 

 

 

-stack.Push()구현 방법

 

data 가 nullptr 일때

Stack.push 구현도

 

 

data 가 nullptr 아닐때

Stack.push 구현도

 

 

 

 

 

 

 

Stack.h

#pragma once
#include <iostream>

using namespace std;

template <typename T>
class Stack
{
private:
	T* data;
	int count;
public:
	void Clear();
	int Count();
	bool IsEmpty();
	void Push(T _data);
	T Pop();
public:
	Stack<T>();
	~Stack<T>();
};

 

 

Stack.cpp

#include "Stack.h"

template <typename T>
void Stack<T>::Clear()
{
	delete[] data;
    data = nullptr;
    count = 0;
}

template <typename T>
int Stack<T>::Count()
{
    return count;
}

template <typename T>
bool Stack<T>::IsEmpty()
{
    return data == nullptr ? true : false;
}

template <typename T>
void Stack<T>::Push(T _data)
{
    if (data == nullptr)
    {
        data = new T;
        data[0] = _data;
    }
    else
    {
        T* temp = new T[count + 1];
        
        for (int i = 0; i < count; i++)
        {
            temp[i] = data[i];
        }
        temp[count] = _data;
        delete[] data;
        data = temp;
    }
    count++;
}

template <typename T>
T Stack<T>::Pop()
{
    if (data == nullptr)
    {
        cout << "데이터가 없습니다." << endl;
        return -1;
    }
   
    T result = data[count - 1];
    T* temp = new T[count-1];

    for (int i = 0; i < count-1; i++)
    {
        temp[i] = data[i];
    }
    delete[] data;
    data = temp;
    count--;
    if (count == 0) { data = nullptr; }
    return result;
}

template <typename T>
Stack<T>::Stack()
{
    data = nullptr;
    count = 0;
}

template <typename T>
Stack<T>::~Stack()
{
    delete[] data;
    data = nullptr;
}

 

 

Main.cpp

#include "Stack.cpp"

int main()
{
	Stack<int> stack;

	for (int i = 0; i < 5; i++)
	{
		cout << i << " 값을 Push 했습니다" << endl;
		stack.Push(i);
		cout << "stack 의 크기:" << stack.Count() << endl;
	}
	cout << "\n" << endl;

	while (!stack.IsEmpty())
	{
		cout<<stack.Pop()<<"값을 Pop 했습니다." << endl;
		cout << "stack 의 크기:" << stack.Count() << endl;
	}
	cout << "\n" << endl;


	cout << 123 << " 값을 Push 했습니다" << endl;
	stack.Push(123);
	cout << 456 << " 값을 Push 했습니다" << endl;
	stack.Push(456);

	cout << "\n" << endl;


	if (stack.IsEmpty()) { cout << "스텍이 비워있습니다." << endl;}
	else { cout << "스텍에 값이 있습니다." << endl; }
	
	cout << "스텍에 있는 값을 모두 제거 하였습니다." << endl;
	stack.Clear();

	if (stack.IsEmpty()) { cout << "스텍이 비워져 있습니다." << endl; }
	else { cout << "스텍에 값이 있습니다." << endl; }

}

 

 

 

 

 

 

 

 

 

 

 

 

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

HashMap(제한된 데이터)  (0) 2023.11.22
CircularList  (1) 2023.11.17
SingleList  (0) 2023.11.15
ArrayList  (1) 2023.11.14
Queue  (0) 2023.11.13