Метод EnQueue не возвращается правильно в циклической очереди C ++? - PullRequest
0 голосов
/ 23 января 2020

У меня менее 3 месяцев опыта кодирования, поэтому я начал использовать LeetCode, чтобы просто строить часы, работая с кодом, превышающим то, что назначено в школе.

Я работал над попыткой построения кольцевой очереди (FIFO ), и он не скомпилируется. Я получил следующую ошибку, и я в замешательстве:

решение. cpp: в функции-члене enQueue Строка 58: Char 2: ошибка: управление достигает конца недействительной функции [-Werror = return-type]}

Одна вещь: я специально получил указание НЕ использовать библиотеку std :: queue, поэтому, хотя я знаю, что это будет гораздо проще, это не вариант.

Полный код того, что я построил, следует:

class MyCircularQueue
{
private:
    int* data = nullptr;
    int size;
    int capacity;
    int front_p;
    int rear_p;

public:
    /** Initialize your data structure here. Set the size of the queue to be k. */
    MyCircularQueue(int k)
    {
        data = new int[k];
        size = 0;
        capacity = k;
        front_p = 0;
        rear_p = 0;
    }

    /** Insert an element into the circular queue. Return true if the operation is successful. */
    bool enQueue(int value)
    {
        if (!isFull() && isEmpty())
        {
            for (int i = 0; i < capacity; i++)
            {
                if (data[i] == 0)
                {
                    data[i] = value;
                    size++;
                    front_p = data[i];
                    rear_p = data[i];
                    return true;
                }
            }
        }
        else if (!isFull())
        {
            for (int i = 0; i < capacity; i++)
            {
                if (data[i] == 0)
                {
                    data[i] = value;
                    size++;
                    front_p = data[i];
                    rear_p = rear_p++;
                    return true;
                }
            }
        }
        else
        {
            return false;
        }
    }

    /** Delete an element from the circular queue. Return true if the operation is successful. */
    bool deQueue()
    {
        if (isEmpty())
        {
            return false;
        }
        else
        {
            front_p = front_p++;
            return true;
        }
    }

    /** Get the front item from the queue. */
    int Front()
    {
        return front_p;
    }

    /** Get the last item from the queue. */
    int Rear()
    {
        return rear_p;
    }

    /** Checks whether the circular queue is empty or not. */
    bool isEmpty()
    {
        for (int i = 0; i < size; i++)
        {
            if (data[i] != 0)
            {
                return false;
            }
            else
                return true;
        }
    }

    /** Checks whether the circular queue is full or not. */
    bool isFull()
    {
        if (size == capacity)
        {
            return true;
        }
        else
            return false;

    }
};

1 Ответ

1 голос
/ 23 января 2020

Вы получаете эту ошибку, потому что выполнение через enQueue не всегда заканчивается оператором return. Логически это может никогда не произойти, но компилятор этого не знает, поскольку видит, что если один из циклов for завершается с i >= capacity, вы не встретите оператор return.

Простое исправление удалить этот последний else и, таким образом, return false; всегда будет выполняться в конце функции.

    }
    return false;
}
...