#include <iostream> #include <vector> #include <cstdlib> #include <cassert> #include <time.h> #include <queue> #include <algorithm> #include <Windows.h> using namespace std; #define TEST_QUEUE template<typename T> class StackMax { public: StackMax(){} const T& Max() { assert(!Empty()); return s[maxIndex()]; } void Push(const T& Val) { s.push_back(Val); if (maxListIndex.empty() || Val > s[maxIndex()]) { maxListIndex.push_back(s.size()-1); } } const T& Top() { assert(!Empty()); return s.back(); } void Pop() { assert(!Empty()); if (maxIndex() == s.size()-1) { maxListIndex.pop_back(); } s.pop_back(); } bool Empty() { return s.empty(); } unsigned Size() { return s.size(); } private: unsigned maxIndex() { return maxListIndex.back(); } private: vector<T> s; //the element index in s,the last is the largest one vector<unsigned> maxListIndex; }; template<typename T> class QueueMax { public: QueueMax(){} bool Empty() { return (s1.Empty() && s2.Empty()); } void Push(const T& Val) { s2.Push(Val); } const T&Top() { assert(!Empty()); if (s1.Empty()) { while(!s2.Empty()) { s1.Push(s2.Top()); s2.Pop(); } } return s1.Top(); } void Pop() { assert(!Empty()); if (s1.Empty()) { while(!s2.Empty()) { s1.Push(s2.Top()); s2.Pop(); } } s1.Pop(); } unsigned Size() { return s1.Size()+s2.Size(); } const T&Max() { assert(!Empty()); if (!s1.Empty()) { if (!s2.Empty() && s2.Max() > s1.Max()) { s2.Max(); } else return s1.Max(); } else return s2.Max(); } private: StackMax<T> s1,s2; }; int main() { srand(time(0)); #ifndef TEST_QUEUE StackMax<int> sm; vector<int> vi; DWORD tSm=0,tVi=0; for (int i=0;i<5000;i++) { if (rand()%3!=0) { int r=rand(); sm.Push(r); vi.push_back(r); } else { if (!sm.Empty()) { sm.Pop(); vi.pop_back(); } } if (!sm.Empty()) { assert(sm.Top() == vi.back()); DWORD t1=GetTickCount(); int m1=sm.Max(); DWORD t2=GetTickCount(); int m2=1<<31; for (int k=0;k<vi.size();k++) m2=max(m2,vi[k]); DWORD t3=GetTickCount(); assert(m1==m2); cout << m1 << '/t' << m2 << endl; tSm+=(t2-t1); tVi+=(t3-t2); } assert(vi.size() == sm.Size()); cout << vi.size() << endl; } while(!sm.Empty()) { assert(sm.Top() == vi.back()); int m1=sm.Max(); int m2=1<<31; for (int k=0;k<vi.size();k++) m2=max(m2,vi[k]); assert(m1==m2); cout << m1 << '/t' << m2 << endl; sm.Pop(); vi.pop_back(); } assert(vi.empty()); cout << tSm << '/t' << tVi << endl; #else QueueMax<int> q; q.Push(3); q.Push(10); q.Push(1); q.Push(6); q.Push(2); q.Push(9); while(!q.Empty()) { cout << q.Max() << endl; q.Pop(); } #endif system("pause"); return 0; } 编程之美3.7