C++기초

220413_자료구조_리스트형 큐 구현 및 실행

2022. 4. 18. 14:51
//Queue.h

#pragma once

#include <assert.h>

/*
* 큐: 선입 선출(FIFO), 선착순
	- 정말 다양한 방식으로 구현이 가능하다.
	- 리스트 기반의 구현 방식, 배열 기반의 구현 방식을 베이스로
	- 양방향으로 추가 가능한 큐라던지, 
		배열 기반의 큐인데, 한정된 배열 공간을 재활용해가며 사용할 수 있는 
		써클 큐라던지로 사용이 가능하다.
*/

//노드는 스택에서 구현했던 방식과 동일하다.
template <typename T>
class CQueueNode
{
	template <typename T>
	friend class CQueue;

private:
	CQueueNode() :
		m_Next(nullptr)
	{
	}
	~CQueueNode()
	{
	}

private:
	T	m_Data;
	CQueueNode<T>* m_Next;
};


//큐는 스택보다 변수가 하나 더 필요하다.
//뺄 때는 처음 노드에서 빼야 하고 넣을 때는 끝 노드에 넣어야 하기 때문이다.
template <typename T>
class CQueue
{
public:
	CQueue()
	{
		m_First = nullptr;
		m_Last = nullptr;
		m_Size = 0;
	}
	~CQueue()
	{
		NODE* Node = m_First;

		while (Node)
		{
			NODE* Next = m_First->m_Next;
			delete Node;
			Node = Next;
		}
	}

private:
	typedef CQueueNode<T>	NODE;

private:
	NODE* m_First;
	NODE* m_Last;
	int m_Size;

public:
	void push(const T& Data)
	{
		//새 노드 만들어 주고
		NODE* Node = new NODE;

		//노드에 데이터 넣어 주고
		Node->m_Data = Data;


		//만약 처음 추가한 값이 아니라면(이미 큐에 값을 넣은 적이 있다면)
		

		//만약 처음 넣은 값이라면(m_Last가 nullptr이면)
		if (!m_Last)
		{
			m_First = Node;
		}
		else
		{
			//주소 연결 해 주고
			m_Last->m_Next = Node;
		}

		//마지막 주소를 Node로 변경해 주고
		m_Last = Node;

		//사이즈를 늘려 주고
		++m_Size;
	}

	T& front()
	{
		if (empty())
		{
			assert(false);
		}

		return m_First->m_Data;
	}

	//큐이므로 pop -> 앞에것 추출
	void pop()
	{
		if (empty())
		{
			assert(false);
		}

		//첫 번째 노드를 임시 변수에 저장하고
		NODE* Node = m_First;

		//다음 노드가 이제 첫 번째 노드가 됨
		m_First = m_First->m_Next;

		//노드 삭제
		delete Node;

		//사이즈 감소
		--m_Size;


		//큐에서는 추가로 다 지웠을 경우에 대한 예외 처리도 필요하다.(다시 초기화)
		if (m_Size == 0)
		{
			m_First = nullptr;
			m_Last = nullptr;
		}
	}


	int size() const
	{
		return m_Size;
	}

	bool empty() const
	{
		return 0 == m_Size;
	}


};

 

 

 

//main.cpp

#include <iostream>
#include "Queue.h"


int main()
{
	std::cout << "\n====== 리스트형 큐 확인 =====" << std::endl;
	CQueue<int> queue;

	for (int i = 0; i < 10; ++i)
	{
		queue.push(i);
	}

	while (!queue.empty())
	{
		std::cout << queue.front() << std::endl;
		queue.pop();
	}
	std::cout << "남은 Size: " << queue.size() << std::endl;
    
    return 0;
}

'C++기초' 카테고리의 다른 글

220414_자료구조_일반 트리(Tree)  (0) 2022.04.20
220413_자료구조_배열형 큐(써클 큐, Circle Queue) 구현 및 실행  (0) 2022.04.18
220412_자료구조_배열형 스택 구현 및 실행  (0) 2022.04.18
220412_자료구조_리스트형 스택(Stack) 구현 및 실행  (0) 2022.04.18
220407~220411_자료구조_링크드 리스트 실행 (Linked List)  (0) 2022.04.18
'C++기초' 카테고리의 다른 글
  • 220414_자료구조_일반 트리(Tree)
  • 220413_자료구조_배열형 큐(써클 큐, Circle Queue) 구현 및 실행
  • 220412_자료구조_배열형 스택 구현 및 실행
  • 220412_자료구조_리스트형 스택(Stack) 구현 및 실행
hyrule
hyrule
hyrule
C++ 프로그래밍 공부
hyrule
전체
오늘
어제
  • 분류 전체보기 (205)
    • C++기초 (50)
    • WIN32API FrameWork (109)
      • 한단계씩 직접 구현 (82)
      • 원본 (15)
      • 코드별 설명 개별저장(검색용) (12)
    • 자습 (21)
    • C++ TIPS (11)
    • 연습 노트 (3)
    • ETC (6)
    • DX2D StarCraft 모작 (1)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 스타크래프트
  • notion
  • hello
  • C++
  • Windows 11
  • Tistory

최근 댓글

최근 글

hELLO · Designed By 정상우.
hyrule
220413_자료구조_리스트형 큐 구현 및 실행
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.