삽입(enqueue)된 데이터가 제일 처음에 삭제 (dequeue)됨선입선출 (First In First Out)이라고 함
그냥 배열을 사용하면 큐를 구현할 수는 있다.
enqueue 하면 그냥 제일 뒤에 추가 O(1)
내부적으로는 insert_at(num_count, 60);

dequeue하면 그냥 제일 앞에서 삭제 O(N)
dequeue();remove_at(0)
하지만 큐의 삭제도 O(1)으로 구현할 수 있다.
enqueue라고 표현O(1)이다enum { MAX_NUMS = 8 };
int s_nums[MAX_NUMS];
size_t s_front = 0;
size_t s_back = 0;
size_t s_num_count = 0;
void enqueue(int n)
{
assert(s_num_count < MAX_NUMS)
s_nums[s_back] = n;
s_back = (s_back + 1) % MAX_NUMS;
++s_num_count;
}
int main(void)
{
enqueue(10); // { 10 }, s_back = 1, s_num_count = 1
enqueue(20); // { 10, 20 }, s_back = 2, s_num_count = 2
enqueue(30);
enqueue(40);
enqueue(50);
enqueue(60);
enqueue(70); // { 10, 20, ... , 70 }, s_back = 7, s_num_count = 7
enqueue(80); // { 10, 20, ... , 70, 80 }, s_back = 8, s_num_count = 8
return 0;
}
dequeue 라고 표현O(1)이다int is_empty(void)
{
return (s_num_count == 0);
}
int dequeue(void)
{
int ret;
assert(is_empty() == FALSE);
ret = s_nums[s_front];
--s_num_count;
s_front = (s_front + 1) % MAX_NUMS;
return ret;
}
/* 메인 함수 */
/* s_nums = { 10, 20, 30, 40, 50 }*/
int item = dequeue(); /* item: 10 */
O(N)이다enqueue()와 dequeue()만 허용하므로 임의의 요소에 접근할 방법이 없다대기 줄이 필요한 경우 모두 적용 가능멀티 쓰레딩에서도 이런 일을 함입출력 스트림 버퍼링도 같은 개념버퍼에 쌓아두고 앞에서 부터 차례대로 접근