tsaiwn@magpie % cat -n myque2.h 1 // myque2.h -- queue class by tsaiwn@csie.nctu.edu.tw 2 // g++ -c myque2.cpp 3 // g++ testmyq2.cpp myque2.o 4 #ifndef __MYQUE2__ 5 #define __MYQUE2__ 6 class MyQueue { 7 enum{ NELEMENT=99 }; // good habit 8 long data[NELEMENT]; 9 int phead, ptail; // phead 指向 queue 的前頭, ptail指向尾巴 10 void initQueue(void){ phead = ptail = 0; } 11 public: 12 MyQueue(void) { initQueue( ); } 13 void enque(long); 14 long deque(void); 15 long front(void) { return data[phead]; } 16 int isempty(void) { return (phead == ptail) ;} 17 int isfull(void) { return ((ptail+1) % NELEMENT) == phead; } 18 ////// ////// 注意 circular queue 的表達方式 19 void push(long x) { enque(x); } 20 long pop(void) { return deque( ); } 21 long top(void) { return front( ); } 22 int empty(void) { return isempty( );} 23 int full(void) { return isfull( );} 24 }; // class MyQueue 25 ////// ////// ////// 26 #endif tsaiwn@magpie % cat -n myque2.cpp 1 // myque2.cpp -- 把宣告寫在 myque2.h 2 // CopyLeft by tsaiwn@csie.nctu.edu.tw 3 #include "myque2.h" 4 // some implementations are in myque2.h 5 ////// ////// ////// 6 void MyQueue::enque(long x) { 7 if( isfull() ) { return; } // may want to give some error message? 8 data[ptail] = x; 9 ptail++; 10 ptail %= NELEMENT; /* x %= y; means x = x % y; */ 11 } 12 long MyQueue::deque(void) { 13 if( !isempty() ) { 14 long tmp=data[phead]; 15 phead++; phead %= NELEMENT; 16 return tmp; 17 } // if !isempty 18 } tsaiwn@magpie % g++ -c myque2.cpp ; nm myque2.o 00000056 T _ZN7MyQueue5dequeEv 00000000 T _ZN7MyQueue5enqueEl 00000000 W _ZN7MyQueue6isfullEv 00000000 W _ZN7MyQueue7isemptyEv tsaiwn@magpie % cat -n testmyq2.cpp 1 //testmyq2.cpp -- copyLeft by tsaiwn@csie.nctu.edu.tw 2 // 以下的 #ifndef 是用來 check 是否為 GNU 的 g++ ? 3 // 若不是則使用舊式的寫法! 例如 Turbo C++ 3.0 只認識舊式的寫法! 4 #ifndef __GNUG__ 5 #include 6 #else 7 #include 8 using namespace std; 9 #endif 10 #include "myque2.h" 11 ////// ////// ////// ////// ////// ////// 12 int main( ) { 13 MyQueue xo; 14 xo.enque(53); 15 xo.push(770); 16 xo.push(880); 17 while(!xo.empty( ) ) { 18 cout << xo.top( ) << " "; xo.pop( ); 19 } 20 cout << endl; // new line 21 return 0; 22 } tsaiwn@magpie % g++ testmyq2.cpp myque2.o tsaiwn@magpie % ./a.out 53 770 880 tsaiwn@magpie % echo p623