본문 바로가기
알고리즘, 자료구조/알고리즘 util

Circular Queue

by Wordbe 2019. 8. 27.
728x90

Circular Queue

Queue의 front에서 추가, 삭제시 O(N)이 걸린다는 것을 보완합니다.

 

 

 

1) List(연결 리스트) 이용해서 구현

#include <cstdio>
#include <list>

using namespace std;

list<int>::iterator circularNext(list<int> &l, list<int>::iterator &it) {
	return next(it) == l.end() ? l.begin() : next(it);
}

list<int>::iterator circularPrev(list<int> &l, list<int>::iterator &it) {
	return it == l.begin() ? --l.end() : prev(it);
}


list<int> circle;

int main() {

	for (int i = 1; i < 6; ++i) {
		circle.emplace_back(i);
	}

	list<int>::iterator it = circle.begin();
	printf("%d\n", *it);
	printf("%d\n", *circularNext(circle, it));
	printf("%d\n", *circularPrev(circle, it));
    
    return 0;
}

 

Size를 알기 위해서는, head부터 모든 포인터를 일일이 다 탐색하여 얻는 수 밖에 없어서 O(N)이 걸립니다.

 

 

2) Array(배열) 이용해서 구현

 

head와 tail을 설정하고, modulus 연산을 이용하여 구현합니다.

 

 

 

 

 

* 두 경우 모두 탐색, (임의 장소에) 추가, 삭제시 시간복잡도는 O(N)입니다.

728x90

'알고리즘, 자료구조 > 알고리즘 util' 카테고리의 다른 글

[정렬] sort  (0) 2019.09.02

댓글