데이터 구조 면접 의 4 - 대열 의 흔 한 조작

13901 단어
데이터 구조 면접 의 4 - 대열 의 흔 한 조작
제목: 는 관련 연습 문제 가 있 지만 생각 이 상대 적 으로 뚜렷 하지 않 고 조판 에 오류 가 있 습 니 다. 저 자 는 이에 대해 관련 서적 과 자신의 관점 을 참고 하여 재 작성 하여 여러분 께 참고 하도록 하 였 습 니 다.
4. 대열 의 기본 조작
1. 배열 로 대기 열 구성
대열 은 바로 선진 적 인 선 출 을 만족 시 키 는 링크 이다.배열 로 저장 하면 대기 열 헤드 front 스 택 을 만족 시 키 고 대기 열 끝 rear 가 스 택 에 들 어가 야 합 니 다.배열 에 있어 서 rear 와 front 는 배열 의 머리 와 끝 을 대표 할 수 있다.간단하게 rear 와 front 의 크기 를 max Size 와 0 으로 고정 할 수 없습니다. 중간 요소 가 비어 있 을 수 있 기 때 문 입 니 다.따라서 배열 대기 열 에 있어 서 고리 식 저장 소 라 고 상상 할 수 있 습 니 다. 매번 가입 후 rear + 1, 매번 출전 후 front + 1 이기 때 문 입 니 다.이것 은 front 와 rear 의 크기 를 조절 해 야 합 니 다. 매번 수정 할 때마다 front = (front + 1)% maxSize, rear = (rear + 1)% maxSize 만 만족 시 키 면 요 구 를 만족 시 킬 수 있 습 니 다.
       마찬가지 로 주의해 야 합 니 다. 입대 작업 전에 대기 열 이 가득 찼 는 지 여 부 를 먼저 판정 합 니 다.팀 을 나 가기 전에 대기 열 이 비어 있 는 지 여 부 를 먼저 판정 합 니 다.
template<typename Type>
class arrQueue
{
public:
       arrQueue(intnSize=100);
       ~arrQueue();
       arrQueue(constarrQueue<Type>& copyQueue);
       arrQueue&operator=(const arrQueue<Type>& otherQueue);
 
       voidinitializeQueue();
       void destroyQueue();
       bool isQueueEmpty();
       bool isQueueFull();
       void addQueue(constType& item);
       void deQueue(Type&deletedItem);
 
private:
       int maxSize;
       int rear;
       int front;
       Type* list;
};
 
template<typename Type>
arrQueue<Type>::arrQueue(int nSize=100)
{
       if(nSize < 0)
       {
              nSize = 100;
              list = newType[nSize];
              front = 0;
              rear = 0;
              maxSize = 100;
       }
       else
       {
              list = newType[nSize];
              front = 0;
              rear = 0;
              maxSize =nSize;
       }
}
 
template<typename Type>
arrQueue<Type>::~arrQueue()
{
       if(!list)
       {
              delete[]list;                  //       , delete []list;
              list = NULL;
       }
}
 
template<typename Type>
arrQueue<Type>::arrQueue(const arrQueue<Type>©Queue)
{
       maxSize =copyQueue.maxSize;
       front =copyQueue.front;
       rear = copyQueue.rear;
       list = newType[maxSize];            //         ,    .
       for( int i = 0; i <rear; i++)
       {
              list[i] =copyQueue.list[i];
       }
}
 
template<typename Type>
arrQueue<Type>& arrQueue<Type>::operator=(constarrQueue<Type>& otherQueue)
{
       if(this ==&otherQueue)
       {
              cout <<"can't copy oneSelf!" << endl;
              return *this;
       }
       else
       {
              if(maxSize !=otherQueue.maxSize)
              {
                     cout<< "The Size of two Queue are not equal!" << endl;
                     return*this;
              }
              else
              {
                     maxSize= otherQueue.maxSize;
                     front =otherQueue.front;
                     rear =otherQueue.rear;
                     for( inti = 0; i < rear; i++)
                     {
                            list[i]= otherQueue.list[i];
                     }//endfor
                     return*this;
              }
       }//end else
}
 
template<typename Type>
void arrQueue<Type>::initializeQueue()
{
       destroyQueue();
}
 
template<typename Type>
void arrQueue<Type>::destroyQueue()
{
       front = 0;
       rear = 0;
}
 
//       rear==front[  ]
template<typename Type>
bool arrQueue<Type>::isQueueEmpty()
{
       return (rear ==front);
}
 
//  1      ,           !
//       :1.        ;
//2.  rear      =front   。
template<typename Type>
bool arrQueue<Type>::isQueueFull()
{
       return((rear+1)%maxSize == front); 
}
 
template<typename Type>
void arrQueue<Type>::addQueue(const Type& item)
{
       if(!isQueueFull())
       {
              list[rear] =item;
              rear =(rear+1)%maxSize;
              cout << item<< " was added to Queue!" << endl;
       }
       else
       {
              cout <<"The Queue was already Full!" << endl;
       }
}
 
template<typename Type>
void arrQueue<Type>::deQueue(Type& deletedItem)
{
       if(!isQueueEmpty())
       {
              deletedItem =list[front];
              front =(front+1)%maxSize;                  //       !
              cout <<deletedItem << " was deleted from Queue!" << endl;
       }
       else
       {
              cout <<"The Queue was already Empty!" << endl;
       }
}

2. 대기 열 은 링크 체인 식 저장 구 조 를 사용한다.
주의: 1) 이때 front 와 rear 는 모두 지침 이 되 었 고 front 는 머리 결점 지침 이 되 었 으 며 rear 는 꼬리 노드 의 지침 이 되 었 습 니 다.2) 이 곳 의 front 와 rear 는 링크 작업 중의 first 와 last 와 유사 합 니 다.3) 입대 실현 은 주로 대열 의 끝부분 에서 이 루어 지 므 로 rear 지침 의 방향 을 조정 해 야 한다.팀 을 나 가 는 작업 은 주로 팀 머리 에서 이 루어 지 므 로 front 지침 의 방향 을 조정 해 야 한다.
template<typename Type>
struct nodeType
{
       Type info;
       nodeType* link;
};
 
template<typename Type>
class linkedQueue
{
public:
       linkedQueue();
       ~linkedQueue();
       linkedQueue(constlinkedQueue<Type>&);
       linkedQueue&operator=(const linkedQueue<Type>&);
 
       voidinitializeQueue();
       void destroyQueue();
       bool isQueueEmpty()const;
       bool isQueueFull()const;
       void addQueue(constType& item);
       void deQueue(Type&poppedItem);
       void nodeCount();
 
private:
       nodeType<Type>*rear;
       nodeType<Type>*front;
       int count;         //      
};
 
template<typename Type>
linkedQueue<Type>::linkedQueue()
{
       count = 0;
       front = NULL;
       rear = NULL;
}
 
template<typename Type>
linkedQueue<Type>::~linkedQueue()
{
       while( front != NULL )
       {
              nodeType<Type>*tempNode = new nodeType<Type>;
              tempNode =front;
              front =front->link;
 
              deletetempNode;
       }
       //  rear   
       rear = NULL;
}
 
template<typename Type>
linkedQueue<Type>::linkedQueue(constlinkedQueue<Type>& copyQueue)
{
       if(copyQueue.front !=NULL)
       {
              nodeType<Type>*current;
              nodeType<Type>*first;
              nodeType<Type>*newNode;
 
              front = newnodeType<Type>;
              front->info= copyQueue.front->info;          //   top     ,    !
              front->link= copyQueue.front->link;
 
              first =front;                        //first      ...
              current =copyQueue.front->link;      //current  copy  ...
              while( current!= NULL)
              {
                     newNode= new nodeType<Type>;
                     newNode->link= current->link;
                     newNode->info= current->info;
 
                     first->link= newNode;
                     first =newNode;
                     current= current->link;
              }//end while
              rear = current;
              count =copyQueue.count;
       }//end if
       else
       {
              front = NULL;
              rear = NULL;
              count = 0;
       }
}
 
template<typename Type>
linkedQueue<Type>& linkedQueue<Type>::operator=(constlinkedQueue<Type>& otherQueue)
{
       //1      
       if(this ==&otherQueue)
       {
              cout <<"Can't copy oneself!" << endl;
              return *this;
       }
       //2  
       else
       {
              if(front !=NULL)
              {
                     destroyQueue();
              }
              if(otherQueue.front!= NULL)
              {
                     nodeType<Type>*current;
                     nodeType<Type>*first;
                     nodeType<Type>*newNode;
 
                     front =new nodeType<Type>;
                     front->info= otherQueue.front->info;
                     front->link= otherQueue.front->link;
                     first =front;                        //first      ...
                     current= otherQueue.front->link;     //current  copy  ...
                     while(current != NULL)
                     {
                            newNode= new nodeType<Type>;
                            newNode->link= current->link;
                            newNode->info= current->info;
 
                            first->link= newNode;
                            first= newNode;
                            current= current->link;
                     }//endwhile
                     rear =current;
                     count =otherQueue.count;
              }//end if
              else
              {
                     front =NULL;
                     rear =NULL;
                     count =0;
              }
              return *this;
       }
}
 
template<typename Type>
void linkedQueue<Type>::initializeQueue()
{
       destroyQueue();
}
 
template<typename Type>
void linkedQueue<Type>::destroyQueue()
{
       count = 0;
       //         :      !
       while(front != NULL)
       {
              nodeType<Type>*temp = new nodeType<Type>;
              temp = front;
              front =front->link;
       }
 
       rear = NULL;
}
 
template<typename Type>
bool linkedQueue<Type>::isQueueEmpty() const
{
       return (front ==NULL);
}
 
template<typename Type>
bool linkedQueue<Type>::isQueueFull() const //     ,    !
{
       return false;
}
 
template<typename Type>
void linkedQueue<Type>::addQueue(const Type& item)
{
       if(!isQueueFull())
       {
              nodeType<Type>*newNode = new nodeType<Type>;
              newNode->info= item;
              newNode->link= NULL;
 
              if(front ==NULL)
              {
                     front =newNode;
                     rear =newNode;
              }
              else
              {
                     rear->link= newNode;
                     rear =newNode;
              }
              count++;
              cout <<item << " was pushed!" << endl;
       }
}
 
template<typename Type>
void linkedQueue<Type>::deQueue(Type& deletedItem)
{
       if(!isQueueEmpty())
       {
              nodeType<Type>*temp = new nodeType<Type>;
              temp = front;
              deletedItem =front->info;
              front =front->link;
 
              count--;
              cout <<deletedItem << " was popped!" << endl;
              delete temp;
       }
}
 
template<typename Type>
void linkedQueue<Type>::nodeCount()
{
       cout <<"nodeCount = " << count << endl;
}
 

3. 스 택 으로 대기 열 구현
스 택 은 선진 적 인 후에 나 오 는 것 이 고 두 개의 스 택 을 사용 합 니 다. 스 택 1 이 선진 적 인 후에 나 오고 스 택 2 는 스 택 1 을 바탕 으로 선진 적 인 선 출 을 실현 할 수 있 습 니 다.
메모: 파티 에 가입 한 addtoQueue 는 스 택 1 에 요 소 를 넣 는 것 을 보증 합 니 다.그리고 파티 deQueue 에 대해 서 는 스 택 1 의 모든 요 소 를 스 택 pop 에서 내 보 낸 다음 에 모두 스 택 2 에 들 어가 마지막 으로 스 택 2 작업 을 수행 하면 됩 니 다.
#include"linkedStack.h"
template<typename Type>
class stackedQueue
{
public:
       stackedQueue();
       ~stackedQueue();
 
       void addQueue(Type item);
       void deQueue(Type deletedItem);
      
       bool isQueueEmpty();
       bool isQueueFull();
 
private:
       nodeType<Type>* front;
       nodeType<Type>* rear;
       linkedStack<Type>* firstStack;
       linkedStack<Type>* secondStack;
       int nodeCnt;    //      
};
 
template<typename Type>
stackedQueue<Type>::stackedQueue()
{
       front = NULL;
       rear = NULL;
    nodeCnt = 0;
      
       firstStack = new linkedStack<Type>;
       secondStack = new linkedStack<Type>;
}
 
template<typename Type>
stackedQueue<Type>::~stackedQueue()
{
       while(front != NULL)
       {
              nodeType<Type>* temp;
              temp = front;
              front = front->link;
       }
       rear = NULL;
       if(firstStack != NULL)
       {
              delete firstStack;
              firstStack = NULL;
       }
       if(secondStack != NULL)
       {
              delete secondStack;
              secondStack = NULL;
       }
}
 
template<typename Type>
voidstackedQueue<Type>::addQueue(Type item)
{
       if(!isQueueFull())
       {
              nodeCnt++;
              firstStack->push(item);        //    1
              cout << item << " was added toQueue!" << endl;
       }
}
 
template<typename Type>
voidstackedQueue<Type>::deQueue(Type deletedItem)
{
       if(!isQueueEmpty())
       {
              while(!firstStack->isStackEmpty())
              {
                     firstStack->pop(deletedItem);              //    1
                     if(!firstStack->isStackFull())
                     {
                            secondStack->push(deletedItem);       //    2
                     }
              }
              if(!secondStack->isStackEmpty())
              {
                     secondStack->pop(deletedItem);            //    2
              }
              cout << deletedItem << " was out ofQueue!" << endl;
              nodeCnt--;
       }
}
 
template<typename Type>
boolstackedQueue<Type>::isQueueEmpty()
{
       return (nodeCnt == 0);
}
 
template<typename Type>
boolstackedQueue<Type>::isQueueFull()
{
       return false;
}

4 절 끝.

좋은 웹페이지 즐겨찾기