Как хранить несколько очередей в массиве? - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть класс очереди, в котором я реализую структуру очереди.

#include "queue.h"

Queue::Queue()
{


}

Queue::Queue(int size){
    front = rear = -1;
    this->size = size;
    Q = new int[size];
}

void Queue::enqueue(int x){
    if (rear == size -1 ){
        cout << " its full" << endl;
    }else{
        rear ++;
        Q[rear] = x;
    }
}

int Queue::dequeue(){
    int x= -1;
    if (rear == front){
        cout << " its empty"<<endl;
    }else{
        front ++;
        x = Q[front];
    }

    return x;
}

void Queue::Display(){
    for(int i= front+1; i<=rear; i++){
        cout << Q[i] << "  ";
    }

    cout << endl;
}

bool Queue::isEmpty(){
    return (size==0);
}
int Queue::peek()
{
    if (isEmpty())
    {
        cout << "UnderFlow\nProgram Terminated\n";
        exit(EXIT_FAILURE);
    }
    return Q[front];
}

В main.cpp я создаю несколько очередей.Я пытаюсь реализовать алгоритм планирования, где мне нужно обработать каждую очередь по порядку.Проблема начинается, когда я пытаюсь пройти через каждую очередь.Я хотел бы использовать только один цикл for для доступа к элементу каждой очереди, а не цикл for для каждой из них.

Пример:

queue [1..N] , где N - количество очередей.В течение цикла я хочу проверить if queue[i].empty().

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Если вам нужно сгенерировать определенное количество экземпляров вашего класса Queue, которое является фиксированным и известным во время компиляции, ваше кодовое решение будет работать.Однако если у вас есть программа, в которой необходимо создавать новые экземпляры очереди во время ее работы, вам необходимо использовать динамическое выделение памяти в куче.

Один из подходов к этому - создать массив или векторуказателей на ваш класс Queue в main.cpp.Std :: vector более гибок, и лучше использовать умный указатель для создания каждого экземпляра очереди, хотя многие академические курсы не позволяют использовать стандартную библиотеку шаблонов или умные указатели, и в этом случае вам нужно простообычный массив указателей на очередь и использование новых и удаление соответствующим образом.

const int SIZE = 100  //max number of Queue instances
Queue* allQueues[SIZE]; //array of uninitialized pointers to Queue
for (int i = 0; i < SIZE; i++) {  //ensure all pointers are set to null
    allQueues[i] = nullptr;
}

//To make a new Queue instance and insert it into the array:
allQueues[0] = new Queue();
//And when done with that Queue instance, to avoid memory leaks and dangling pointers:
delete allQueues[0];
allQueues[0] = nullptr;

(все гораздо лучше сделать с помощью std :: array или std :: vector и интеллектуальных указателей).Обратите внимание также на использование памяти: без этого подхода у вас есть два полноразмерных экземпляра Queue для queue1 вместо самого объекта и указателя на этот объект.Тем не менее, можно использовать массив указателей, используя только автоматическое выделение стека, но в этом случае вы не хотите создавать новые объекты во время выполнения.Для этого все просто:

Queue* allQueues[4];
allQueues[0] = &queue1;
//etc.

PS Одна проблема с вашим решением состоит в том, что при выполнении этого задания:

allQueues[0] = queue1;

Вам нужен конструктор копирования в вашем классе или перегруженныйОператор '=', чтобы гарантировать, что все внутренности queue1 правильно скопированы в массив объектов Queue, и избежать всех проблем с "мелким копированием".

Queue::Queue(const Queue& copySource) {
    this->size = copysource.size;
    this->Q = new int[copysource.size];
    for (int i = 0; i < size; i++) {
        this->Q[i] = copysource.Q[i];
    }

См .: Почему можноДоступ к закрытым переменным в конструкторе копирования?

0 голосов
/ 22 сентября 2019

Я нашел решение проблемы.В main.cpp следующий код решил проблему.

Queue allQueues[4];

allQueues[0] = queue1;
allQueues[1] = queue2;
allQueues[2] = queue3;
allQueues[3] = queue4;

Для доступа:

for(int i=0; i<4; i++){

    if allQueues[i].empty(){
        //do something
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...