[C++][STL]스택(stack) 구현

jh Seo·2022년 6월 18일
3

자료구조 구현

목록 보기
3/6
post-custom-banner

개요

스택은 자료구조의 한 종류로
LIFO(Last In, First Out)방식이다.

말 그대로, 제일 늦게 삽입된 원소가
제일 먼저 빠져나오는 구조로

FIFO(First In, FIrst Out)방식인
큐(queue)와는 반대다.

배열을 이용한 코드

#include<iostream>

using namespace std;

template <typename T>

class stack {
private:
	T* arr;								//스택 원소 넣는 배열
	int s_size;							//스택의 사이즈
	int topCursor;						//스택의 top가리키는 커서						

public:
	stack() {							//초기화
		s_size = 0;
		arr = new T[10'000];
		topCursor= 0;
	}
	~stack() {
		delete[] arr;
	}

	void push(T elem){						//원소 넣기
		arr[topCursor] = elem;
		topCursor++;

	}
	void pop(T elem){						//원소 빼기
		if (s_size!=0) {					//비어있지 않을 때
			arr[topCursor-1] = 0;
			topCursor--;
		}
		else {
			cout << "스택이 비어있습니다." << '\n';
		}
	}
	T top(){								//스택의 top 값(먼저 빠짐)
		return arr[topCursor-1];
	}

	bool empty(){							//스택이 비어있는지 여부
		if (s_size==0)
			return true;
		else 
			return false;
	}
	int size(){								//큐의 크기
		return s_size;
	}
};


스택의 제일 top을 가리키는 topCursor을 이용해
구현했다.

연결리스트를 이용한 코드

#include<iostream>

using namespace std;

template <typename T>

struct Node {
	T data;
	Node* next;
};

template <typename T>
class stack {
private:
	int q_size;								//스택 사이즈
	Node<T>* head;							//스택의 top부분 가리키는 포인터


public:
	//생성자
	stack() {						
		q_size = 0;
		Node<T>* tmpHead = new Node<T>;		
		tmpHead->data = T();
		tmpHead->next = tmpHead;
		head = tmpHead;
	}
	//소멸자
	~stack() {
		Node<T>* tmp = head;
		Node<T>* delNode = tmp;
		while (tmp != nullptr) {
			delNode = tmp;
			tmp = tmp->next;
			delete delNode;
		}

	}
	//원소 넣기
	void push(T elem) {				
		//새로운 노드 생성
		Node<T>* newNode = new Node<T>;
		newNode->data = elem;
		//연결작업
		newNode->next = head->next;
		head->next = newNode;
		q_size++;

	}
	void pop() {							//원소 빼기
		if (!empty()) {						//비어있지 않을 때
			Node<T>* delNode = head->next;
			head->next = delNode->next;
			delete delNode;
			q_size--;
		}
		else {
			cout << "큐가 비어있습니다." << '\n';
		}
	}
	T top() {								//큐의 제일 앞 값(먼저 빠짐)
		return head->next->data;
	}
	bool empty() {							//큐가 비어있는지 여부
		if (q_size == 0)
			return true;
		else return false;
	}
	int size() {								//큐의 크기
		return q_size;
	}
};

이중연결리스트와는 다르게 각 노드의 next포인터만 신경써주면 돼서 한결 구현하기 편했다.

profile
코딩 창고!
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 7월 5일

ㅋㅋ 이번포스트는 짧네! 네가 컴퓨터쪽 하고싶다고 진로잡은지 한 1년정도된거같은데 그때에 비해서 다른누구의 도움도없이 혼자서 이정도 수준까지 올라오고 코드를 짤수있게되다니...그때 c같이 공부한 나로써는 네가정말 대단해보여! 넌 나한테 늘 신기한 영감을 주는아이야. 진짜 넌최고야! 그러니 지금해오던대로만, 앞으로도 쭉 나아가자! 당장 결과물이 보이지않더라도 네가노력한건 전부 너에게 보답할거야. 네가어떤길로 나아가든 응원해. 사랑해!❤️

답글 달기