밍경송의 E.B
<5> 큐(Queue) 본문
이 글은 시험이 19시간정도 남은 사람이 내용 정리를 위해 적는 글입니다.
*[C언어로 쉽게 풀어쓴 자료구조] 책과 숙영리 교수님의 강의를 참고하여 작성하였음을 밝힙니다.
이걸로 계속 가겠음.🪸😎
🪸 특징
: 선입선출(FIFO) - 들어오는 문과 나가는 문이 다름.
- enqueue : 큐의 끝(rear)에 요소를 추가함.
- dequeue : 큐의 앞(front)에서 요소를 제하고 반환함.
* peek() : 큐의 앞에서 요소를 읽어 반환함 (제거하지 않음)
🪸 선형큐
: 배열을 선형으로 사용하여 큐를 구현한 것
*front : 가장 최근에 제거된 data가 저장됐던 위치
*rear : 가장 최근에 들어온 data의 위치
* 초기 상태의 front , rear의 값은 -1
* 공백 상태의 경우 front == rear ; 가장 최근에 들어온 요소가 제거됐다는 의미
✨ 문제점: front에서 요소들이 삭제되어 여유공간이 있어도 파악 불가 (full을 판단할 때 rear만 가지고 판단하기 때문)
==> 원형큐로 해결 가능!
-enqueue
- dequeue
*스택이랑 헷갈리지 말자! 스택에서 pop하는 경우에는, 요소를 먼저 빼고 top 변수를 1감소했음.
🪸 원형큐
- front : 첫번째 요소 하나 앞의 인덱스
- rear : 마지막 요소의 인덱스
(둘 다 시계방향으로 돎)
* 초기 상태의 front, rear 값은 0, 저장은 1부터! --> 공백상태와 포화상태의 구분을 위해서 하나의 공간을 비움!
* 공백 상태 : front == rear (선형큐랑 동일)
✨포화 상태 : front % M == (rear +1) % M
--> index의 값이 7 다음에 0으로 가야하니까 modulo 연산을사용함!
-enqueue
-dequeue
*스택이랑 헷갈리지 말자! 스택에서 pop하는 경우에는, 요소를 먼저 빼고 top 변수를 1감소했음.
🪸 큐의 응용 : 버퍼
: 서로 다른 속도로 실행되는 두 프로세스 간의 상호작용 조화
😎 큐에 일정한 비율로 난수를 생성해 입력 (20%) 하고, 일정한 비율로 출력(10%) 하는 프로그램
=> enqueue가 실행될 확률이 더 높기 때문에 큐가 growing!
🪸 덱 (deque)
: 전단(front)와 후단(rear)에서 모두 삽입과 삭제가 가능한 큐
😎연산 ***
1) 스택과 동일한 연산 : add_front() , delete_front()
2) 큐와 동일한 연산 : delete_front() , add_rear()
3) 덱만의 연산 : delete_rear() , 조금 다른 add_front()
-배열을 이용한 덱의 구현
: front<- (front -1 + M) % M
: rear <- (rear -1 + M) % M
* -1을 했을 때 음수가 되면 안되기 때문에 M을 더해줘야 함.
-큐와 동일한 공백/포화 검출 함수
✨ add_rear(후단 삽입)과 delete_front(전단 삽입)의 경우에도 큐와 코드가 동일함.
q->rear = (q->rear+1) % M; 다음에 삽입
q->front = (q->front+1) % M; 다음에 삭제
✨큐와 다른 add_front() 와 delete_rear
-add_front()
-delete_rear()
🥲아 진짜.. 헷갈려요,,,,,,,,,,,,,,,,,,,,ㅠ 긍까 원형 큐의 경우에는 전단(rear)에서만 삽입이 일어나고, 후단(front)에서만 삭제가 일어나죠.. 원형큐의 경우에는 M다음에 0으로 가야하니까.응응.. 삽입할 때는 rear +1 하면 되는데, 그러면 M 다음에 M+1로 가잖아 그러니까 rear +1 % M 해준다. 오키 삭제할 때도 마찬가지임. front +1 한담에 삭제하면 되는데 동일한 이유로 front +1 % M해줘야 함.
자 덱의 경우에도 전단rear 삽입과 후단front 삭제의 경우에는 위와 동일하게 진행되지만, 특이한 점 전단rear 삭제와 후단front 삽입이 가능하다는것. 이 경우에는? rear랑 front 값을 빼줘야 하는 거잖아요? 그러니까 위에처럼 계산하면 안됨 왜냐면 이제 문제가 되는 거는 index 0에서 -1 했을 때 M이 돼야 하는데 음수값이 되는 것. -> 그래서 삽입의 경우 front -1 + M 한 거를 %M , 삭제의 경우 rear -1 + M % M 이런 식으로 해줘야 돼!!!!!!오키 이해했음
'CSE > 자료구조&알고리즘' 카테고리의 다른 글
<7> 원형 연결리스트, 이중 연결리스트 (1) | 2023.10.26 |
---|---|
<6> 단일 연결리스트 (1) | 2023.10.26 |
<4> 스택(Stack) (0) | 2023.10.26 |
<3> 배열, 구조체, 포인터 (0) | 2023.10.25 |
<2> 순환(Recursion) 과 반복(Iterative) (0) | 2023.10.25 |