#ifndef __SQUEUE_HPP #define __SQUEUE_HPP #include #include #include "abstract_queue.hpp" template class StaticQueue : public AbstractQueue { private: static const size_t SIZE = 100; T queue[SIZE]; int front, back; bool full() const { return (back + 2) % SIZE == front; } public: // създава празна опашка StaticQueue() : front(0), back(-1) {} // проверява дали опашка е празна virtual bool empty() const { return (back + 1) % SIZE == front; } // включване на елемент в края на опашката virtual void enqueue(T const&); // изключване на елемента в началото на опашката virtual T dequeue(); // поглеждане на елемента в началото на опашката virtual T const& head() const; // поглеждане на елемента в началото на опашката с възможност за промяна virtual T& head(); }; template T StaticQueue::dequeue() { if (empty()) throw std::runtime_error("Опит за изваждане от празна опашка"); T result = queue[front]; // front %= SIZE <---> front = (front == SIZE) ? 0 : front; ++front %= SIZE; return result; } template void StaticQueue::enqueue(T const& x) { if (full()) throw std::runtime_error("Надвишаване на капацитета при опит за включване на елемент"); queue[++back %= SIZE] = x; } template T const& StaticQueue::head() const { if (empty()) throw std::runtime_error("Опит за поглеждане в празна опашка"); return queue[front]; } template T& StaticQueue::head() { if (empty()) throw std::runtime_error("Опит за поглеждане в празна опашка"); return queue[front]; } #endif