Successfully reported this slideshow.

강의자료5

938 views

Published on

  • Be the first to comment

  • Be the first to like this

강의자료5

  1. 1. 3 장 ADTs Stack and Queue (Queue)
  2. 2. What is a Queue? <ul><li>Logical (or ADT) level: A queue is an ordered group of homogeneous items (elements), in which new elements are added at one end (the rear) , and elements are removed from the other end (the front ). </li></ul><ul><li>순서가 있는 동형의 원소들의 모임 ; 원소 삽입은 한쪽 끝에서 일어나고 삭제는 다른쪽 끝에서 일어남 </li></ul><ul><li>A queue is a FIFO “first in, first out” structure. </li></ul>
  3. 3. Queue ADT Operations <ul><li>MakeEmpty -- Sets queue to an empty state. </li></ul><ul><li>IsEmpty -- Determines whether the queue is currently empty. </li></ul><ul><li> </li></ul><ul><li>IsFull -- Determines whether the queue is currently full. </li></ul><ul><li>Enqueue (ItemType newItem) -- Adds newItem to the rear of the queue. </li></ul><ul><li> </li></ul><ul><li>Dequeue (ItemType& item) -- Removes the item at the front of the queue and returns it in item. </li></ul>
  4. 4. ADT Queue Operations <ul><li>Transformers </li></ul><ul><ul><li>MakeEmpty </li></ul></ul><ul><ul><li>Enqueue </li></ul></ul><ul><ul><li>Dequeue </li></ul></ul><ul><li>Observers </li></ul><ul><ul><li>IsEmpty </li></ul></ul><ul><ul><li>IsFull </li></ul></ul>change state observe state
  5. 5. DYNAMIC ARRAY IMPLEMENTATION( circular queue) QueType ~QueType Enqueue Dequeue . . . class QueType Private Data: front 1 rear 4 maxQue 5 items ‘ C’ ‘X’ ‘J’ items [0] [1] [2] [3] [4] RESERVED
  6. 6. 큐 구현 - (1) <ul><li>큐의 구현 : 1 차원 배열 items[] 이용 </li></ul><ul><ul><li>큐의 첫번째 원소 (front) 원소를 items[0] 로 표현한 큐 </li></ul></ul>A B C … B C D … B C … [0] [1] [2] [0] [1] [0] [1] [2] rear rear rear 원소를 하나 삭제한 뒤의 상태 원소를 하나 삽입한 뒤의 상태 - 삭제 : queue[0] 에 있는 앞 원소를 제거  삭제할 때마다 나머지 원소들을 왼쪽으로 이동해야 함  큐가 n 개의 원소를 가질 때 , 삭제 시 Θ (n) 시간이 걸림 - 삽입 : 배열 크기 조절 시간을 제외하면 Θ (1) 시간이 걸림
  7. 7. 큐 구현 - (2) <ul><li>큐의 구현 </li></ul><ul><ul><li>(2) 큐의 첫번째 원소를 items[front] 로 표현한 큐 </li></ul></ul><ul><ul><li>- 변수 front 를 사용하여 큐의 첫번째 위치를 항상 유지 </li></ul></ul><ul><ul><li>- 원소의 삭제를 Θ (1) 시간에 수행하기 위한 방법 </li></ul></ul><ul><ul><li>- 큐의 원소 : items[front], …, items[rear] </li></ul></ul>A B C … B C D … B C … rear rear rear 첫번째 원소를 삭제한 뒤의 상태 원소를 하나 삽입한 뒤의 상태 front front front
  8. 8. 큐 구현 - (2) <ul><li>큐의 구현 </li></ul><ul><li>(2) 큐의 첫번째 원소를 items[front] 로 표현한 큐 ( 계속 ) </li></ul><ul><ul><li>- 배열 queue 의 크기가 capacity 일 경우 , </li></ul></ul><ul><li>rear 가 capacity-1 과 같고 , front > 0 일 때 문제 발생 </li></ul><ul><li>- 배열의 크기를 확장하지 않고 어떻게 원소를 삽입할까 ? </li></ul><ul><ul><ul><li>큐의 모든 원소를 왼쪽 끝으로 이동시켜 오른 쪽 끝에 공간을 만드는 방법 </li></ul></ul></ul><ul><ul><ul><li>– 배열 이동에 많은 시간 소요 : 큐의 원소 수에 비례 </li></ul></ul></ul><ul><ul><ul><li>원형 큐를 사용하는 방법 </li></ul></ul></ul><ul><ul><ul><li>– 큐가 배열의 끝에서 되돌아오게 하여 최악의 경우 삽입 , 삭제 시간을 O(1) 으로 한다 . </li></ul></ul></ul>… A B C D E A B C D E ... rear rear front front (a) 이동 전 (b) 이동 후
  9. 9. 큐 구현 - (3) <ul><li>원형 큐 (Circular queue) </li></ul><ul><ul><li>변수 front 는 큐에서 첫 원소의 위치를 가리킴 </li></ul></ul><ul><ul><li>변수 rear 는 큐에서 마지막 원소의 위치 다음을 ( 시계방향으로 ) 가리킴 </li></ul></ul>A B C A B C D B C D rear rear rear front front front (a) 현재상태 (b) 삽입 (c) 삭제
  10. 10. Circular Queue items[0] items[1] items[2] items[maxQue-1] 논리적으로 배열의 시작과 끝이 이어져 있는 것으로 간주 items items[0] items[1] items[maxQue-1]
  11. 11. 경계조건 (boundary conditions) items[maxQue-1] front rear front rear Enqueue(a1) Enqueue(a2) front rear Enqueue(a3) front rear Dnqueue(x) front rear Queue is empty 인 상태 : rear == front a1 a1 a2 a1 a2 a3 a2 a3
  12. 12. 경계조건 (boundary conditions) front rear rear front Enqueue( … ) … Dequeue( … ) … rear front Enqueue( … ) ⇒ Queue is full Queue 가 empty 일 경우와 full 일 경우 모두 front = rear 가 되어 구분이 가능하지 않다 . 따라서 , Queue 가 full 인 상태 : (rear +1) % maxQue == front a2 a3
  13. 13. <ul><li>//-------------------------------------------------------- </li></ul><ul><li>// CLASS TEMPLATE DEFINITION FOR CIRCULAR QUEUE </li></ul><ul><li>#include &quot;ItemType.h&quot; // for ItemType </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>class QueType </li></ul><ul><li>{ </li></ul><ul><li>public: </li></ul><ul><li>QueType( ); </li></ul><ul><li>QueType( int max ); // PARAMETERIZED CONSTRUCTOR </li></ul><ul><li>~QueType( ) ; // DESTRUCTOR </li></ul><ul><li>. . . </li></ul><ul><li>bool IsFull( ) const; </li></ul><ul><li>void Enqueue( ItemType item ); </li></ul><ul><li>void Dequeue( ItemType& item ); </li></ul><ul><li>private: </li></ul><ul><li>int front; </li></ul><ul><li>int rear; </li></ul><ul><li>int maxQue; </li></ul><ul><li>ItemType* items; // DYNAMIC ARRAY IMPLEMENTATION </li></ul><ul><li>}; </li></ul>
  14. 14. <ul><li>//-------------------------------------------------------- </li></ul><ul><li>// CLASS TEMPLATE DEFINITION FOR CIRCULAR QUEUE cont’d </li></ul><ul><li>//-------------------------------------------------------- </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>QueType <ItemType> ::QueType( int max ) // PARAMETERIZED </li></ul><ul><li>{ </li></ul><ul><li>maxQue = max + 1; </li></ul><ul><li>front = 0; </li></ul><ul><li>rear = 0; </li></ul><ul><li>items = new ItemType[maxQue]; // dynamically allocates </li></ul><ul><li>} </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>QueType <ItemType> ::QueType() // default class constructor </li></ul><ul><li>maxQue = 501; </li></ul><ul><li>front = 0; rear = 0; </li></ul><ul><li>items = new ItemType[maxQue]; // dynamically allocates </li></ul><ul><li>} </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>bool QueType <ItemType> ::IsEmpty( ) </li></ul><ul><li>{ </li></ul><ul><li>return ( rear == front ) </li></ul><ul><li>} </li></ul>
  15. 15. <ul><li>//-------------------------------------------------------- </li></ul><ul><li>// CLASS TEMPLATE DEFINITION FOR CIRCULAR QUEUE cont’d </li></ul><ul><li>//-------------------------------------------------------- </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>QueType <ItemType> ::~QueType ( ) // 소멸자 </li></ul><ul><li>{ </li></ul><ul><li>delete [ ] items; // deallocates array </li></ul><ul><li>} </li></ul><ul><li>. </li></ul><ul><li>. </li></ul><ul><li>. </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>bool QueType <ItemType> ::IsFull( ) </li></ul><ul><li>{ </li></ul><ul><li>return ( (rear + 1) % maxQue == front ) // WRAP AROUND </li></ul><ul><li>} </li></ul>
  16. 16. <ul><li>//-------------------------------------------------------- </li></ul><ul><li>// CLASS TEMPLATE DEFINITION FOR CIRCULAR QUEUE cont’d </li></ul><ul><li>//-------------------------------------------------------- </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>void QueType <ItemType> ::Enqueue(ItemType newitem ) </li></ul><ul><li>{ </li></ul><ul><li>if( IsFull() ) </li></ul><ul><li>{ </li></ul><ul><li> cout << “Queue is full n”; // 예외처리 </li></ul><ul><li>return; </li></ul><ul><li>} </li></ul><ul><li>items[rear] = newitem; </li></ul><ul><li>rear = (rear + 1) % maxQue; // WRAP AROUND </li></ul><ul><li>} </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>void QueType <ItemType> ::Dequeue(ItemType &item ) </li></ul><ul><li>{ </li></ul><ul><li>if( IsEmpty() ) </li></ul><ul><li>{ </li></ul><ul><li> cout << “Queue is empty n”; // 예외처리 </li></ul><ul><li>return; </li></ul><ul><li>} </li></ul><ul><li>item = items[front]; </li></ul><ul><li>front = (front + 1) % maxQue; // WRAP AROUND </li></ul><ul><li>} </li></ul>
  17. 17. SAYS ALL PUBLIC MEMBERS OF QueType CAN BE INVOKED FOR OBJECTS OF TYPE CountedQuType <ul><li>// DERIVED CLASS CountedQueType FROM BASE CLASS QueType </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>class CountedQueType : public QueType<ItemType> </li></ul><ul><li>{ </li></ul><ul><li>public: </li></ul><ul><li>CountedQueType( ); </li></ul><ul><li>void Enqueue( ItemType newItem ); </li></ul><ul><li>void Dequeue( ItemType& item ); </li></ul><ul><li>int LengthIs( ) const; </li></ul><ul><li>// Returns number of items on the counted queue. </li></ul><ul><li>private: </li></ul><ul><li>int length; </li></ul><ul><li>}; </li></ul>
  18. 18. class CountedQueType<char>
  19. 19. <ul><li>// Member function definitions for class CountedQue </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>CountedQueType <ItemType> ::CountedQueType( ) : QueType<ItemType>( ) </li></ul><ul><li>{ </li></ul><ul><li>length = 0 ; </li></ul><ul><li>} </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>int CountedQueType <ItemType> ::LengthIs( ) const </li></ul><ul><li>{ </li></ul><ul><li>return length ; </li></ul><ul><li>} </li></ul>
  20. 20. <ul><li>template<class ItemType> </li></ul><ul><li>void CountedQueType <ItemType> ::Enqueue( ItemType newItem ) </li></ul><ul><li>// Adds newItem to the rear of the queue. </li></ul><ul><li>// Increments length. </li></ul><ul><li>{ </li></ul><ul><li>length++; </li></ul><ul><li>QueType<ItemType>::Enqueue( newItem ); </li></ul><ul><li>} </li></ul><ul><li>template<class ItemType> </li></ul><ul><li>void CountedQueType <ItemType> ::Dequeue(ItemType& item ) </li></ul><ul><li>// Removes item from the rear of the queue. </li></ul><ul><li>// Decrements length. </li></ul><ul><li>{ </li></ul><ul><li>length--; </li></ul><ul><li>QueType<ItemType>::Dequeue( item ); </li></ul><ul><li>} </li></ul>

×