[자료구조] Stack and Queue

오늘은 어떤 코드일까 궁금하담 ^^ 항상 상상을 초월하는 교수님의 코드 ㅎㅎㅎㅎㅎ 오늘도 화이팅><

✨𝐒𝐓𝐀𝐂𝐊✨


스택이란 한쪽이 막힌(homogeneous) 통에 쌓아올린 것 : 프링글스, 초코통, 동전 쌓기 등등..

💡 스택(Stack)의 이해

📌 스택이란?
스택은 ‘먼저 들어간 것이 나중에 나오는 자료구조’이다.

  • ‘LIFO(Last-in, First-out) 구조'이다.
    후입선출 방식
  • 프링글스로 이해하면 쉽다.
    ∙ 프링글스 통에 감자칩을 넣는다. push
    ∙ 프링글스 통에서 감자칩을 꺼낸다. pop
    ∙ 이번에 꺼낼 감자칩이 무엇인지 통 안을 들여다 본다. top

💡 스택(Stack) ADT 정의

앞에서 리스트 자료구조의 ADT는 필요에 따라서 정렬 기능이라던지 그 정의 내용에 약간씩 차이가 있지만, 그에 비해 스택의 ADT는 상대적으로 정형화된 편이다. 프링글스 통을 가지고 감자칩을 넣고, 꺼내고, 들여다 보는 연산 등이 주를 이룰 것이다❕ 따라서 스택 자료구조의 ADT를 정의하면 다음과 같다.

📌 스택 ADT 정의

  • void MakeEmpty();
    스택을 비어있는 상태로 설정함.
  • bool IsEmpty() const;
    스택이 비어있는 경우, TRUE(1)을, 그렇지 않은 경우 FALSE(0)을 반환함.
  • bool IsFull() const;
    스택이 가득찬 경우, TRUE(1)을, 그렇지 않은 경우 FALSE(0)을 반환함.
  • void Push(ItemType item);
    스택에 데이터를 저장한다. 매개변수 item로 전달된 값을 저장함.
  • void Pop();
    ∙ 마지막에 저장된 요소를 삭제한다.
    ∙ 본 함수의 호출을 위해서는 데이터가 하나 이상 존재해야한다.
  • ItemType Top();
    ∙ 마지막에 저장된 요소를 반환하되 삭제하지 않는다.
    ∙ 본 함수의 호출을 위해서는 데이터가 하나 이상 존재해야한다.

스택은 배열로 구현하기 때문에 배열 멤버가 하나 필요하고, 요소의 위치에 대한 pointer 역할로 top 멤버 변수를 하나 둔다.

💡 스택의 배열 기반 구현

<StackType.h> 헤더파일 선언

#pragma once
#include "itemtype.h"
template<class ItemType> //formal parameter

class FullStack 
{};
class EmptyStack 
{};

class StackType
{
public:
	StackType();
	// Class constructor.
	bool IsFull() const;
	bool IsEmpty() const;
	void Push(ItemType item);
	void Pop();
	ItemType Top();
private:
	int top;
	ItemType items[MAX_ITEM];
};

<StackType.cpp> 구현

이번 구현에서는throw를 사용해 예외 클래스를 생성한다.

  • Pop()이나 Top()을 쓰기 전에 IsEmpty()가 true이면 EmptyStack()클래스에 던져버린다.
  • Push()를 쓰기 전에 IsFull()이 true이면 FullStack()클래스에 던져버린다.
#include <iostream>
#include "StackType.h" 

StackType::StackType()
{
	top = -1;
	//비어있는 경우 top = -1
}
bool StackType::IsEmpty() const
{
	return(top == -1);
}
bool StackType::IsFull() const
{
	return (top == MAX_ITEM - 1);
}
void StackType::Push(ItemType newItem)
{
	if (IsFull())
		throw FullStack();
	//예외 클래스의 '익명 객체'를 생성한 후 이를 던진다.
		top++;
	items[top] = newItem;
}
void StackType::Pop()
{
	if (IsEmpty())
		throw EmptyStack();
	top--;
}
ItemType StackType::Top()
{
	if (IsEmpty())
		throw EmptyStack();
	return items[top];
}

재미있는 코드인 것 같담 ^_^..
하지만 스택에 다양한 자료형을 넣고 싶은데, 매번 바꿔줘야하는 번거로움이 있기 때문에 template를 활용해 다시 구현해보겠다.

Class Template

template <class T> //formal parameter
class Myclass{
	T xx;
};

와 같은 형식으로 사용한다.
코드를 actual parameter로 사용은 Myclass<float> g;와 같이 사용한다.

좋은 웹페이지 즐겨찾기