#include #include /******************************************************************************* * ATENÇÃO: * 1. Se precisar uma fila, use std::queue, ao invés de implementar a sua. * 2. Este código tem erros que serão discutidos mais tarde. */ // Representa uma Fila ou FIFO (first in first out), com operações de inserção // (push), leitura do valor na frente (front), retirada (pop) e verificação se // está vazia (is_emty). class Queue { struct Node { int value; Node *next; }; Node *_front{nullptr}; Node *_back{nullptr}; public: // Insere v no fim da fila. void push(int v); // Descarta elemento da frente da fila. void pop(); // Lê valor do elemento da frente da fila. int front() const; // Verifica se está vazia. bool is_empty() const; }; // Insere v na pilha. void Queue::push(int v) { Node *new_node = new Node; new_node->value = v; new_node->next = nullptr; if (_back) { _back->next = new_node; _back = new_node; } else { _front = _back = new_node; } } // Descarta elemento no topo da pilha. // Pré-condição: !is_empty() void Queue::pop() { Node *tmp = _front; _front = _front->next; if (tmp == _back) { // Retirou o último elemento! _back = nullptr; } delete tmp; } // Retorna elemento do topo da pilha. // Pré-condição: !is_empty() int Queue::front() const { return _front->value; } // Verifica se a pilha está vazia. bool Queue::is_empty() const { return _front == nullptr; } // Alguns testes simples. int main(int, char const *[]) { Queue my_queue; for (int i = 0; i < 4; ++i) { my_queue.push(i); } std::cout << "Primeiro na fila: " << my_queue.front() << std::endl; my_queue.pop(); for (int i = 0; i < 3; ++i) { my_queue.push(3 * i); } std::cout << "Fila atual: "; while (!my_queue.is_empty()) { auto x = my_queue.front(); my_queue.pop(); std::cout << x << " "; } std::cout << std::endl; }