[C++][STL]큐(queue) 구현

jh Seo·2022년 6월 18일
1

자료구조 구현

목록 보기
2/6

개요

큐(queue)란 자료구조 중 하나로
FIFO(First In, First Out)방식이다.

말 그대로 먼저 큐에 들어간 원소가
먼저 나오는 방식으로
LIFO(Last In, First Out)방식인
스택(stack) 자료구조와는 반대다.

(배열을 이용한)코드

#include<iostream>

using namespace std;

template <typename T>

class queue {
private:
	T* arr;								//큐 원소 넣는 배열
	int q_size;							//큐의 사이즈
	int frontCursor;					//큐의 front가리키는 커서
	int rearCursor;						//큐의 back가리키는 커서

public:
	queue() {							//초기화
		q_size = 0;
		arr = new T[10'000];
		frontCursor = 5'000;
		rearCursor = 5'000;
	}
	~queue() {
		delete[] arr;
	}

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

	}
	void pop(T elem){						//원소 빼기
		if (q_size!=0) {						//비어있지 않을 때
			arr[frontCursor] = 0;
			frontCursor++;
            q_size--;
		}
		else {
			cout << "큐가 비어있습니다." << '\n';
		}
	}
	T front(){								//큐의 제일 앞 값(먼저 빠짐)
		return arr[frontCursor];
	}
	T back(){								//큐의 제일 뒷 값
		return arr[rearCursor-1];
	}
	bool empty(){							//큐가 비어있는지 여부
		if (q_size==0)
			return true;
		else return false;
	}
	int size(){								//큐의 크기
		return q_size;
	}
};

맨 앞 위치를 나타내는 frontCursor와
맨 뒤 위취를 나타내는 rearCursor을 이용해 구현했다.

연결리스트를 이용한 구현

#include<iostream>

using namespace std;

template <typename T>

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

template <typename T>
class queue {
private:
	int q_size;							//큐의 사이즈
	Node<T>* head;							//큐의 앞부분 가리키는 노드포인터
	Node<T>* tail;							//큐의 뒷 노드 가리키는 노드포인터

public:
	//생성자
	queue() {						
		q_size = 0;
		Node<T>* tmpHead = new Node<T>;		
		Node<T>* tmpTail = new Node<T>;
		tmpHead->data = T();
		tmpTail->data = T();
		tmpHead->next = tmpTail;
		tmpHead->prev = tmpHead;
		tmpTail->next = tmpTail;
		tmpTail->prev = tmpHead;

		head = tmpHead;
		tail = tmpTail;

	}
	//소멸자
	~queue() {
		Node<T>* tmp = head;
		Node<T>* delNode = tmp;
		while (tmp != tail) {
			delNode = tmp;
			tmp = tmp->next;
			delete delNode;
		}
		//반복문빠져나왔다면 tmp는 tail노드이므로
		delete tmp;

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

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

노드 구조체를 구현한 후, 해당 노드를 이용한 이중연결리스트 queue클래스를 짜서
큐의 멤버함수들을 구현하였다.

profile
코딩 창고!

4개의 댓글

comment-user-thumbnail
2022년 6월 20일

와우 FIFO랑 LIFO는 회계에서도 똑같이 쓰는개념인데.... 거기선 선입선출 후입선출이라고 해! ㅋㅋ 반갑구나^_^ 파이포 라이포라고 하는데 난구냥 삐뽀라고했지롱

답글 달기
comment-user-thumbnail
2022년 6월 20일

ㅋ 근데 처음이 queue 이걸 큐라구 못읽고 머지 큐이우웨..&@#₩%~? 일케읽엇다

답글 달기
comment-user-thumbnail
2022년 9월 19일

궁금한게 있습니다. 이 코드에서 push 또는 pop을 5,000번만 쓸 수 있는 건가요?

1개의 답글