算法导论第三版第十章10.1-5题
#ifndef C11LEARN_DEQUE_H #define C11LEARN_DEQUE_H template<typename T> class Deque { private: int capacity; T*array; int head; int tail; public: Deque(int capacity = 20); Deque(const Deque<T>& deque); Deque<T>& operator=(const Deque<T>& deque); virtual ~Deque(); void head_enqueue(const T &element); T head_dequeue(); void tail_enqueue(T &element); T tail_enqueue(); bool empty(); bool full(); }; template<typename T> Deque<T>::Deque(int capacity):capacity(capacity){ if(this->capacity<20) this->capacity = 20; array = new T[capacity]; head = tail = 0; } template<typename T> Deque<T>::Deque(const Deque<T>& deque){ capacity = deque.capacity; array = new T[capacity]; head = deque.head; tail = deque.tail; for (int i = 0; i < capacity; ++i) { array[i] = deque.array[i]; } } template<typename T> Deque<T>::~Deque() { delete[] array; } template<typename T> Deque<T>& Deque<T>::operator=(const Deque<T>& deque){ if(array!= nullptr) delete[] array; capacity = deque.capacity; array = new T[capacity]; head = deque.head; tail = deque.tail; for (int i = 0; i < capacity; ++i) { array[i] = deque.array[i]; } } template<typename T> void Deque<T>::head_enqueue(const T &element){ if(full()) throw "overflow"; head--; if(head<0) head = capacity - 1; array[head] = element; } template<typename T> T Deque<T>::head_dequeue(){ if(empty()) throw "underflow"; T element = array[head]; head++; if(head == capacity) head = 0; return element; } template<typename T> void Deque<T>::tail_enqueue(T &element){ if(full()) throw "overflow"; array[tail] = element; if(tail == capacity - 1) tail = 0; else tail++; } template<typename T> T Deque<T>::tail_enqueue(){ if(empty()) throw "underflow"; tail--; if(tail < 0) tail = capacity - 1; return array[tail]; } template<typename T> bool Deque<T>::empty(){ return head == tail; } template<typename T> bool Deque<T>::full(){ return head == (tail + 1 == capacity ? 0 : tail + 1); } #endif //C11LEARN_DEQUE_H