Вот быстрый пример использования std::queue
:
#include <iostream>
#include <queue>
int main()
{
// This deque is declared just to more easily instantiate the queue
std::deque<int> deck{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::queue<int> q{deck};
while (!q.empty()) {
if (q.front() % 2 == 0) {
std::cout << q.front() << ' ';
}
q.pop();
}
std::cout << '\n';
}
Вы были на правильном пути, используя мод 2, но все в вашей «очереди» неверно. Проще говоря, вы не написали очередь и определенно не циклическую очередь.
Очереди - это структуры данных FIFO; первым прибыл, первым обслужен. Думайте об этом как о туннеле. Я буду добавлять элементы только с одного конца, и я буду удалять элементы только с другого. Все, что находится посередине, значения не имеет, кроме размера очереди. Это означает, что видимые элементы только являются первыми и последними. Если я хочу увидеть второй элемент очереди, я должен удалить первый элемент.
Написанный вами код рассматривает ваш массив как список, где у вас есть свободный доступ ко всем элементам.
Лучше написать реальный класс очереди, и я надеюсь, что если вы пишете структуры данных, вы сможете написать класс.
Вот очень простой c класс очереди, который демонстрирует поведение, о котором вы спрашиваете. В этом нет ничего кругового. Слово «круговой» подразумевает, что ваша очередь должна быть реализована с использованием кругового связанного списка, а не массива. Стоит отметить, что для этого требуется как минимум C ++ 11, но сегодня это не должно быть проблемой.
ВАЖНО Этот код не учитывает множество необходимых проверок ошибок. Например, back()
, вероятно, приведет к неопределенному поведению при вызове, помимо прочего, в пустой очереди. Это было сделано намеренно, чтобы избежать прямого копирования / вставки, потому что обманывать домашнее задание - это плохо.
#include <array>
#include <iostream>
namespace Q {
class queue {
public:
int &front() { return m_arr[0]; }
int &back() { return m_arr[m_size - 1]; }
void push(int val) {
if (m_size < 5) {
m_arr[m_size] = val;
++m_size;
}
}
// Shifts entire array one to the left
void pop() {
if (m_size > 0) {
for (int i = 1; i < m_size; ++i) {
m_arr[i - 1] = m_arr[i];
}
--m_size;
}
}
bool empty() const { return m_size == 0; }
private:
std::array<int, 5> m_arr = {0};
int m_size = 0;
};
}; // namespace Q
int main() {
Q::queue q;
for (int i = 1; i <= 5; ++i) {
q.push(i);
}
while (!q.empty()) {
if (q.front() % 2 == 0) {
std::cout << q.front() << ' ';
}
q.pop();
}
std::cout << '\n';
}