//////////////////////////////////// // MT3Q1.cpp - Priority Queue #include #include enum Priority { High, Low }; class msg { public: msg(std::string m="", Priority p=Low) : _p(p), _m(m) {} msg(const msg& m) : _p(m._p), _m(m._m) {} Priority priority() { return _p; } operator std::string () { return _m; } bool IsNull() { return _m.compare("") == 0; } msg& operator=(const msg& m) { if(this == &m) return *this; _p = m._p; _m = m._m; return *this; } private: Priority _p; std::string _m; }; class PriorityQueue { public: void enQ(msg& m) { switch(m.priority()) { case High: hi.push(m); return; case Low: lo.push(m); return; } } msg deQ() { msg temp(""); if(hi.size() > 0) { temp = hi.front(); hi.pop(); return temp; } else if(lo.size() > 0) { temp = lo.front(); lo.pop(); return temp; } return temp; } size_t size() { return hi.size() + lo.size(); } private: std::queue hi; // queues have correct copy and assignment so std::queue lo; // compiler generated copy and assignment work }; // void main() { PriorityQueue pq; std::cout << "\n # msgs in queue: " << pq.size(); msg mHi("high priority message",High); msg mLo("Low priority message",Low); std::cout << "\n pushing hi priority msg"; pq.enQ(mHi); std::cout << "\n pushing lo priority msg"; pq.enQ(mLo); std::cout << "\n pushing hi priority msg"; pq.enQ(mHi); std::cout << "\n # msgs in queue: " << pq.size(); msg m; do { m = pq.deQ(); std::cout << "\n " << static_cast(m).c_str(); } while(pq.size() > 0); std::cout << "\n # msgs in queue: " << pq.size(); std::cout << "\n\n"; }