2012-02-03 2 views
0

배열을 사용하여 큐를 구현하려고합니다.배열을 사용하여 큐에 넣기 >> 팝핑 후 요소 이동

#include <iostream.h> 
#define SIZE 5 

class queue 
{ 
    int *Queue, front, rear; 

    public: 
    queue() { 
     Queue = new int[SIZE]; 
     front = rear = -1; 
    } 

    void push() { 
     if (rear == (SIZE-1)) { 
      cout<<"\n Overflow!"; 
     } else { 
      rear++; 
      cout<<"\n Enter element: "; 
      cin>>Queue[rear]; 
     } 
    } 

    void pop() { 
     if (front == rear) { 
      cout<<"\n Underflow!"; 
     } else { 
      cout<<"\nElement popped: "<<Queue[++front]; 
     } 
    } 

    void display() { 
     if (front == rear) { 
      cout<<"\n Queue Empty"; 
     } else { 
      for(int i = (front+1); i<=rear; i++) { 
       cout<<Queue[i]<<" "; 
      } 
     } 
    } 
}; 


int main() 
{ 
    int choice; 
    queue q; 
    while(choice != 4) 
    { 
     cout<<"\n\n Enter your choice :" 
      <<"\n 1. Push an element into Queue." 
      <<"\n 2. Pop an element from Queue." 
      <<"\n 3. Display the Queue." 
      <<"\n 4. Exit the program.\n\n"; 
     cin>>choice; 

     switch (choice) { 
      case 1: 
       q.push(); 
       break; 
      case 2: 
       q.pop(); 
       break; 
      case 3: 
       q.display(); 
       break; 
      case 4: 
       break; 
     } 
    } 

    return 0; 
} 

것은이 오버 플로우가 충족되면, 심지어 요소 터지는 후 후면이 동일하게 유지하고 갈 수있는 빈 공간이있을 때 다른 요소가 추가되지 않는 것입니다 : 여기 내 코드입니다.

이 해결책은 모든 요소를 ​​한 자리 앞으로 옮겨서 끝에 빈 자리가 있지만 교대로 문제가 있습니다. 또한 오버플로에 도달하기 전에 2-3 번 터진 후 삽입하려고하면 대기열에 요소가 3 개 밖에없는 경우에도 여전히 오버플로가 발생합니다. 어떻게 해결할 수 있습니까?

+0

들여 쓰기를 수정하려면 글을 수정하십시오. 스택 오버플로에서 들여 쓰기에 공백을 사용하십시오 (실제 코드가 아님에도 불구하고!) –

+0

thry about sry .. – maddy

+1

무엇이 ''입니까? –

답변

0

front 또는를 재설정하지 마십시오. 영원히 계속 유지됩니다.

overlflow 테스트

도 잘못 :

if (rear == (SIZE-1)) { 
     cout<<"\n Overflow!"; 

당신의 전면을 덮어하려고하면 무엇을 테스트해야하는 것입니다. 나는 당신이 단지 front과 요소의 수를 N로 유지함으로써 이익을 얻을 것이라고 생각한다. 그런 다음 오버플로 및 언더 플로우가 대신 N>SIZEN==0이됩니다. 그런 다음 팝업하고 누를 때 N을 늘리거나 줄입니다. 정면을 그대로 유지하고 또한 모듈로 유지하십시오 SIZE.

또한 메모에 기록되어 있습니다. 데이터를 이동할 필요가 없습니다.

+0

음 .. 감사합니다 또한 요소를 이동하는 시프트 루프를 추가하려고합니다. – maddy

+0

내가하려고하는 것은 요소를 한 칸 앞으로 이동시킨 후 정면을 일정하게 유지하고 후면을 재설정하는 것입니다. cout << ""\ nElement populated : "<< Queue [front + 1]; 프런트가 영원히 증가하지 않도록 [++ front] 대신 을 사용하십시오. – maddy

0

Circular Buffer을 구현하면 전체 데이터를 이동하지 않아도됩니다.

+0

앞쪽 ++는 오버플로가 발생한 후 첫 번째 팝에서 가비지 값을 제공합니다. – maddy

+0

물론, 링크 된 기사에 설명 된대로 'front % = SIZE'와 같이 대기열 크기를'앞쪽으로 '줄여야합니다. – Henrik

관련 문제