#include <iostream> #include <cstdlib> #include <string> #include <list> #include <cassert> #include <map> #include <set> #include <time.h> #include <set> #include <stack> #include <vector> #include <queue> #include <algorithm> using namespace std; #define NULL 0 template<typename T> class Queue { public: Queue(unsigned capacity):cap(capacity),_size(0),head(0),tail(-1) { v.resize(capacity); } bool empty() { return _size==0; } unsigned size() { return _size; } unsigned capacity() { return cap; } void push(const T& val) { assert(_size<cap); if (_size<cap) { tail++; tail%=cap; v[tail]=val; ++_size; } } const T& front() { assert(!empty()); return v[head]; } void pop() { assert(!empty()); if (!empty()) { head++; head%=cap; --_size; } } const T& back() { assert(!empty()); return v[tail]; } private: vector<T> v; unsigned _size; int head; int tail; unsigned cap; }; int main() { srand(time(0)); const int capacity=100; Queue<int> Myq(capacity); queue<int> q; for (int i=0;i<10000;i++) { if (rand()%2) { if (Myq.size()<Myq.capacity()) { int r=rand(); Myq.push(r); q.push(r); } } else { if (!Myq.empty()) { int r1=Myq.front(); int r2=q.front(); assert(r1==r2); int t1=Myq.back(); int t2=q.back(); assert(t1==t2); cout << r1 << '/t' << r2 << "/t/t" << t1 << '/t' << t2 << endl; Myq.pop(); q.pop(); } } //cout << Myq.head << '/t' << Myq.tail; //if (Myq.head > Myq.tail) //{ // cout << "*******"; //} cout << endl; } assert(Myq.size()==q.size()); // return 0; }