2016-03-10 2 views
0

Недавно я пришел в очередь данных struture. Чтобы научиться чему-то новому, я решил реализовать его без библиотеки STL. Дело в том, что мне довольно сложно определить разницу между типичным массивом и очередью.Очередь, реализованная с помощью классов

я определил простой класс

class Queue{ 

public: 

    Queue(); 
    Queue(int); 


    void enqueue(int); 
    int dequeue(); 
    int first_out() ; 
    int last_out() ; 
    bool isEmpty(); 
    bool isFull(); 

private: 

    int current; 
    int maxi; 
    int *arr; 
    int frontt; 
    int rear; 

}; 

его конструктор

Queue::Queue(int maxo){ 
    this -> current = 0; 
    this -> maxi = maxo; 
    this -> arr = new int[maxi]; 
    this -> frontt = 0; 
    this -> rear = 0; 
} 

метод Епдиеие, который перераспределять массив внутри, когда он пытается получить доступ к индексу, который больше максимального показателя.

void Queue::enqueue(int a){ 
    if(this -> rear == this -> maxi){ 

     int *temp; 
     int tmp = maxi; 
     while(this -> rear >= this -> maxi){ 
      this -> maxi *= 2; 
     } 
     temp = new int[maxi]; 
     for(int i = 0; i < tmp ; i++){ 
      temp[i]=arr[i]; 
     } 
     rear = maxi; 
     delete[] arr; 
     arr = temp; 

    } 
    this -> arr[rear++] = a; 


} 

Dequeue, который увеличивает передний индекс.

int Queue::dequeue(){ 



return arr[frontt++]; 

    } 
    int Queue::first_out(){ 

     return arr[frontt]; 

    } 

    int Queue::last_out(){ 

     return arr[rear-1]; 

    } 

    bool Queue::isEmpty(){ 

     if(this -> frontt == this -> rear){ 
      cout << "Queue is empty" << endl; 
      return 1; 
     } 
     return 0; 
    } 
    bool Queue::isFull(){ 

     if(this -> frontt == (this -> rear+1) % this -> maxi){ 


      return 1; 

     } 
     return 0; 
    } 

Основная функция, чтобы проверить это

Queue tst(5); 
    cout << "Write numbers" << endl; 
    int n; 
    while(cin >> n){ 
     tst.enqueue(n); 
    } 
    tst.dequeue(); 
    cout << "The firt out element is " << tst.first_out() << endl; 
    cout << "The last out element is " << tst.last_out() << endl; 
    return 0; 

Мой вопрос довольно тривиально. Это как реализовать очередь? Могу ли я понять это, поскольку очередь - это просто генератор/итератор значений? Зачем использовать очередь вместо массива? И какова точка очереди круга?

Спасибо за ответы.

+1

Почему бы вам не взглянуть на реализацию стандартной библиотеки C++ и не сравнить с вашими? –

ответ

0

По крайней мере, в C и C++ массив определен в конкретных терминах. В частности, он определяется с точки зрения макета памяти - объектов в последовательных ячейках памяти. Как вы его используете, что вы делаете с ним и т. Д., Полностью определяются этим определением.

Очередь определена более абстрактно: она должна поддерживать пару конкретных операций (добавление и извлечение элементов) и отношения порядка между ними (сначала сначала, так и первым). Несколько вспомогательных операций, таких как проверка, является ли очередь пустой, или проверка ее текущего размера, также часто предоставляются (но обычно не рассматриваются как часть определения).

Вы можете использовать массив для реализации очереди. Вы также можете использовать связанный список. Хотя это может и не иметь большого смысла, вы можете использовать двоичное дерево, многодорожечное дерево, гибрид, такой как связанный список массивов, или, по сути, что-нибудь еще, о чем вы можете думать, до тех пор, пока оно поддерживает требуемые операции.

В другом направлении вы можете использовать массив для реализации не только очереди, но также стека, дека, очереди кучи/приоритета, кругового буфера или любого количества других абстракций.

Что касается вашего конкретного вопроса: «Это как реализовать очередь»? Я бы сказал, в общем, нет. Только для одного примера вы игнорируете закон большой тройки, поэтому назначение, копирование и уничтожение на самом деле не работают для вашей очереди (но вы не мешали назначению или копированию). Вы также использовали new[], чтобы выделить пространство очереди, которое создает объекты в это пространство сразу после выделения. Это нормально для очереди примитивных объектов, таких как int, но не так хорошо в целом. Аналогично, ваша очередь может распечатать сообщение в ответ на isEmpty(). Предполагая, что он существует вообще, isEmpty должен просто вернуть значение, чтобы указать, является ли очередь пустой или нет - если требуется печатное сообщение, которое должно обрабатываться другим кодом.

+0

Хороший ответ, есть ли какой-нибудь пример или учебник, когда я мог видеть, как сделать это правильно? Пока я нашел его только с помощью библиотеки STL – user3706129

Смежные вопросы