#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
template<class T> void print_queue(T& q) {
while(!q.empty()) {
std::cout << q.top() << " ";
q.pop();
}
std::cout << '\n';
}
template<class T>
class priority_stack {
vector<T> stack;
public:
bool empty() const { return stack.size()==0; }
void push(const T& x) {
stack.push_back(x);
for (int i=stack.size()-1; i!=0; i--)
if ( (stack[i]<stack[i-1])) // assuming priority is reflected in order of elements
swap (stack[i-1],stack[i]);
}
void pop() {
if (! empty() )
stack.resize(stack.size()-1);
}
T top() {
if (empty())
throw;
return stack[stack.size()-1];
}
};
struct data {
int priority;
string message;
bool operator< (const data&a) const {
return priority<a.priority;
}
};
ostream& operator<< (ostream& os, const data &x) {
return os<<"("<<x.priority<<","<<x.message<<")";
}
int main() {
vector<data> d{ { 10, "one"}, {10, "two"}, {11,"high"}, {12,"very high"}, {10,"three"} };
cout << "Data to be pushed:";
copy (d.cbegin(), d.cend(), ostream_iterator<data>(cout," "));
cout<<endl;
cout << "Priority queue (FIFO): ";
std::priority_queue<data, std::vector<data>> pq;
for (auto x: d)
pq.push(x);
print_queue(pq);
cout << "Priority stack (LIFO): ";
priority_stack<data> ps;
for (auto x: d)
ps.push(x);
print_queue(ps);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBwcmludF9xdWV1ZShUJiBxKSB7CiAgICB3aGlsZSghcS5lbXB0eSgpKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHEudG9wKCkgPDwgIiAiOwogICAgICAgIHEucG9wKCk7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgJ1xuJzsKfQogCnRlbXBsYXRlPGNsYXNzIFQ+IApjbGFzcyBwcmlvcml0eV9zdGFjayB7Cgl2ZWN0b3I8VD4gc3RhY2s7ICAKcHVibGljOiAgCiAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc3RhY2suc2l6ZSgpPT0wOyB9IAogICAgdm9pZCBwdXNoKGNvbnN0IFQmIHgpIHsgCiAgICAJc3RhY2sucHVzaF9iYWNrKHgpOyAKICAgIAlmb3IgKGludCBpPXN0YWNrLnNpemUoKS0xOyBpIT0wOyBpLS0pCiAgICAJICAgIGlmICggKHN0YWNrW2ldPHN0YWNrW2ktMV0pKSAgICAgICAgICAgIC8vIGFzc3VtaW5nIHByaW9yaXR5IGlzIHJlZmxlY3RlZCBpbiBvcmRlciBvZiBlbGVtZW50cwogICAgCSAgICAgICAgc3dhcCAoc3RhY2tbaS0xXSxzdGFja1tpXSk7CiAgICB9ICAKICAgIHZvaWQgcG9wKCkgewogICAgICAgIGlmICghIGVtcHR5KCkgKQogICAgICAgICAgICBzdGFjay5yZXNpemUoc3RhY2suc2l6ZSgpLTEpOwogICAgfQogICAgVCB0b3AoKSB7IAogICAgCWlmIChlbXB0eSgpKSAKICAgIAkgICAgdGhyb3c7IAogICAgCXJldHVybiBzdGFja1tzdGFjay5zaXplKCktMV07IAogICAgfSAgCn07CgogCnN0cnVjdCBkYXRhIHsKICAgIGludCBwcmlvcml0eTsgCiAgICBzdHJpbmcgbWVzc2FnZTsgIAogICAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IGRhdGEmYSkgY29uc3QgewogICAgCXJldHVybiBwcmlvcml0eTxhLnByaW9yaXR5OyAgCiAgICB9IAp9OwogCm9zdHJlYW0mIG9wZXJhdG9yPDwgKG9zdHJlYW0mIG9zLCBjb25zdCBkYXRhICZ4KSB7CglyZXR1cm4gb3M8PCIoIjw8eC5wcmlvcml0eTw8IiwiPDx4Lm1lc3NhZ2U8PCIpIjsKfQoKCmludCBtYWluKCkgewoJdmVjdG9yPGRhdGE+IGR7IHsgMTAsICJvbmUifSwgezEwLCAidHdvIn0sIHsxMSwiaGlnaCJ9LCB7MTIsInZlcnkgaGlnaCJ9LCB7MTAsInRocmVlIn0gfTsKICAgIGNvdXQgPDwgIkRhdGEgdG8gYmUgcHVzaGVkOiI7CiAgICBjb3B5IChkLmNiZWdpbigpLCBkLmNlbmQoKSwgb3N0cmVhbV9pdGVyYXRvcjxkYXRhPihjb3V0LCIgIikpOwogICAgY291dDw8ZW5kbDsKCiAgICBjb3V0IDw8ICJQcmlvcml0eSBxdWV1ZSAoRklGTyk6ICI7CQogICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxkYXRhLCBzdGQ6OnZlY3RvcjxkYXRhPj4gcHE7CiAgICBmb3IgKGF1dG8geDogZCkgCiAgICAgICAgcHEucHVzaCh4KTsKICAgIHByaW50X3F1ZXVlKHBxKTsKICAgIAogICAgY291dCA8PCAiUHJpb3JpdHkgc3RhY2sgKExJRk8pOiAiOwkKICAgIHByaW9yaXR5X3N0YWNrPGRhdGE+IHBzOyAKICAgIGZvciAoYXV0byB4OiBkKSAKICAgICAgICBwcy5wdXNoKHgpOwogICAgcHJpbnRfcXVldWUocHMpOwogICAgCiAJcmV0dXJuIDA7Cn0=
Data to be pushed:(10,one) (10,two) (11,high) (12,very high) (10,three)
Priority queue (FIFO): (12,very high) (11,high) (10,one) (10,two) (10,three)
Priority stack (LIFO): (12,very high) (11,high) (10,three) (10,two) (10,one)