• 큐의 기본 구조





-큐는 입력과 출력의 방향이 반대다.


-들어온 순서대로 처리가되는 선입선출(FIFO), 이와 반대되는 후입선출(LIFO) 방식의 대표적인 예는 스택(Stack)이 있다.


-큐(Queue)란 단어의 의미는 대기행령, 대기줄이다. 어떤 일을 순차적으로 처리하고자 할때 사용된다.


-큐에서 입력은 Put, 출력을 Get이라 편의상 부르겠다(입력을 Enqueue, 출력을 Dequeue라고 하기도 한다).





  • 환형큐(원형큐)



-왚과 뒤가 원처럼 이어져 있는 큐 구조


-입력과 출력이 이어지며, Front와 Rear의 위치가 계속 변경되게 된다.


-선형큐의 문제점을 해결하기 위해, 나왔다고 한다.


-입력을 하면 Rear(뒷 부분)가 한칸 뒤로 밀린다.


-출력을 하면 Front(앞 부분)가 한칸 뒤로 밀린다.


-Rear는 빈공간을 가리킨다.


-최대 입력 가능한 데이터 수는, 최대 공간보다 한칸 적다(Rear가 빈공간을 하나 차지하니까!).

Max Data = Max Size - 1;








  • 큐의 입력(Put, Enqueue)








  • 큐의 출력(Get, Dequeue)





  • 전체 코드










  • 스택 기본 구조



-스택은 입출력이 한방향으로 이루어 진다(자료를 입력하는 쪽과 출력하는 쪽이 같다).

-늦게 들어온 자료가 더 빨리 나가는 구조(LIFO : Last in First out).

-일반적으로 스텍에서 입력을 Push, 출력을 Pop이라고 한다.






현실에서 LIFO의 예



  • 스택의 삽입(Push)

-스택의 삽입은 가장 앞쪽에서 이루어 진다.


-위 그림에서 Head노드는 데이터는 갖지 않고, 첫번째 노드의 위치를 저장하는 노드다

(Head노드에도 데이터를 저장한다면, 삽입 노드가 Head노드가 되게하면 된다).



Head노드의 다음노드(Next) = 삽입노드

삽입 노드의 다음노드(Next) = 노드#01(첫번째 데이터 노드)




삽입 완료





  • 스택의 출력(Pop)



출력(Pop) 요청시 첫번째 노드를 출력




Head노드의 다음노드(Next)를 2번째 노드(출력 노드의 Next)로 지정

( = 2번째 노드를 첫번째 노드로 만듬)



데이터 전달 & 노드를 삭제를 완료하면

출력 종료




  • 전체 코드




  • 템플릿으로 구현한 스택


'자료구조' 카테고리의 다른 글

트리 순회 알고리즘#01 전위 순회(Preorder Traversal)  (0) 2017.01.23
이진 트리(Binary Tree)  (0) 2017.01.23
큐(Queue)  (0) 2017.01.22
이중 링크드 리스트(Doubly Linked List)  (1) 2017.01.20
링크드 리스트(Linked List)  (0) 2017.01.20









  • 이중 링크드 리스트 기본 구조


-노드는 정보(Data) & 다음 노드(Next)가 누구인지  & 이전 노드가(Prev) 누구인지 저장하고 있다.


-제일 앞의 노드(Head)와 제일 뒤의 노드(End)를 연결 시키면 원형 링크드 리스트가 된다.



  • 단일 링크드 리스트와의 차이

-이중 링크드 리스트는 전 노드에 접근 가능하다는 장점이 있다.



  • 이중 링크드 리스트 삽입


삽입할 노드가 들어갈 위치를 찾고,



노드#01의 다음노드(Next) = 삽입노드

삽입 노드의 전 노드(Prev) = 노드#01



삽입 노드의 다음노드(Next) = 노드#02

노드#02의 전 노드(Prev) = 삽입노드




삽입 종료


  • 이중 링크드 리스트 삭제
이중 링크드 리스트의 삭제는

삭제할 노드의 앞뒤를 연결 시킨 후, 삭제할 노드를 삭제하면 된다.

단일 링크드 리스트와 다른 점이라면, 뒷노드의 Prev(전 노드)도 신경 써야 한다는 점이다.



삭제할 노드를 찾고,




삭제할 노드의 앞노드(삭제 노드의 Prev) : 노드#01

삭제할 노드의 다음 노드(삭제 노드의 Next) : 노드#02


[노드#01과 노드#02를 연결]

노드#01의 다음 노드(Next) = 노드#02

노드#02의 전 노드(Prev) = 노드#01



앞뒤 노드 연결이 완료되면,

노드를 삭제하면 된다.


  • 전체 코드



'자료구조' 카테고리의 다른 글

트리 순회 알고리즘#01 전위 순회(Preorder Traversal)  (0) 2017.01.23
이진 트리(Binary Tree)  (0) 2017.01.23
큐(Queue)  (0) 2017.01.22
스택(Stack)  (0) 2017.01.21
링크드 리스트(Linked List)  (0) 2017.01.20

+ Recent posts