此例只是把前面 myque2.h 與 myque2.cpp 再合寫成 template class 注意以下的 Line 4, Line 25, line 26, Line 32, Line 33 tsaiwn@magpie % cat -n myque3.h 1 // myque3.h -- template queue class by tsaiwn@csie.nctu.edu.tw 2 #ifndef __MYQUE3__ 3 #define __MYQUE3__ 4 template 5 class MyQueue { 6 enum{ NELEMENT=99 }; // good habit 7 HAHA data[NELEMENT]; 8 int phead, ptail; // phead 指向 queue 的前頭, ptail指向尾巴 9 void initQueue(void){ phead = ptail = 0; } 10 public: 11 MyQueue(void) { initQueue( ); } 12 void enque(HAHA); 13 HAHA deque(void); 14 HAHA front(void) { return data[phead]; } 15 int isempty(void) { return (phead == ptail) ;} 16 int isfull(void) { return ((ptail+1) % NELEMENT) == phead; } 17 ////// ////// 注意 circular queue 的表達方式 18 void push(HAHA x) { enque(x); } 19 HAHA pop(void) { return deque( ); } 20 HAHA top(void) { return front( ); } 21 int empty(void) { return isempty( );} 22 int full(void) { return isfull( );} 23 }; // class MyQueue 24 ////// ////// ////// 25 template 26 void MyQueue::enque(HAHA x) { 27 if( isfull() ) { return; } // may want to give some error message? 28 data[ptail] = x; 29 ptail++; 30 ptail %= NELEMENT; /* x %= y; means x = x % y; */ 31 } 32 template 33 HAHA MyQueue::deque(void) { 34 if( !isempty() ) { 35 HAHA tmp=data[phead]; 36 phead++; phead %= NELEMENT; 37 return tmp; 38 } // if !isempty 39 } 40 #endif tsaiwn@magpie % cat -n testmyq3.cpp 1 //testmyq3.cpp -- using template class MyQueue in myque3.h 2 // CopyLeft by tsaiwn@csie.nctu.edu.tw 3 #include "myque3.h" 4 // 以下的 #ifndef 是用來 check 是否為 GNU 的 g++ ? 5 // 若不是則使用舊式的寫法! 例如 Turbo C++ 3.0 只認識舊式的寫法! 6 #ifndef __GNUG__ 7 #include 8 #else 9 #include 10 using namespace std; 11 #endif 12 ////// ////// ////// ////// ////// ////// 13 int main( ) { 14 MyQueue xo; 15 xo.enque(53); 16 xo.push(770); 17 xo.push(880); 18 while(!xo.empty( ) ) { 19 cout << xo.top( ) << " "; xo.pop( ); 20 } 21 cout << endl; // new line 22 return 0; 23 } tsaiwn@magpie % g++ testmyq3.cpp tsaiwn@magpie % ./a.out 53 770 880 tsaiwn@magpie % echo p624