12.7 上机实践习题
1.定义两个函数模板,能够进行各种类型数据的加法算法及除字符串数据类型外的减法算法。
【提示】上述题目主要是要求读者熟悉函数模板的相关知识,重点是掌握模板和函数模板的概念及作用。
【关键代码】
01 template<class Ex> 02 Ex Add(Ex x,Ex y)//函数模板的声明 03 { 04 return x+y; 05 } 06 template<class Ex> 07 Ex Sub(Ex x,Ex y) 08 { 09 return x-y; 10 } 11 12 template<>charAdd<char>(charpx,charpy)//特化定义 13 { 14 strcat(px,py); 15 return px; 16 }
2.定义一个队列类模板,其中包括置空队、判队空、入队、出队及判断队满的成员函数。
【提示】上述题目主要是要求读者熟悉类模板的相关知识,重点是掌握类模板的概念、定义和使用。
队列的规则如下所述。
❑nHead直接指向了队头的数据位置。
❑nTail直接指向了队尾要插入的位置。
❑如果nTail=nHead,队列为空。
❑nTail比nHead位置小1(就是在它前面一个),代表队满。
❑所以数组中能存放的数据要比数组的空间小1,是为了判断队列满的情况。
【关键代码】
01 template<class T,int num>//类型参数表 02 class MyQueue//Queue类定义 03 { 04 private: 05 T sz[num];//存储空间,用数组表示 06 int nTail;//队列尾 07 int nHead;//队列头 08 public: 09 MyQueue();//构造函数 10 bool QueueEmpty();//判断队列是否为空 11 bool QueueFull();//判断队列是否已满 12 bool InQueue(const T&);//将1个元素入队 13 bool OutQueue(T&);//从队列中弹出1个元素 14 }; 15 template<class T,int num> 16 MyQueue<T,num>:MyQueue() 17 { 18 nTail=0;//初始位置为0 19 nHead=0; 20 } 21 template<class T1,int num1>//参数列表不要求每个字都相同,但形式要相同 22 bool MyQueue<T1,num1>:QueueEmpty() 23 { 24 return(nTail==nHead);//队头等于队尾说明当前无元素 25 } 26 template<class T,int num> 27 bool MyQueue<T,num>:QueueFull() 28 { 29 return(nTail+1)%num==nHead;//如果nTail比nHead小1,则队列满 30 } 31 template<class T,int num> 32 bool MyQueue<T,num>:InQueue(const T&obt) 33 { 34 if(QueueFull()) 35 return false;//如果队列已满,入队不成功,返回false 36 else 37 { 38 sz[nTail]=obt;//将传入的元素存储在nTail指向的当前位置 39 nTail=(nTail+1)%num;//加1,向队列后面移动 40 return true;//入队成功,返回true 41 } 42 } 43 template<class T,int num> 44 bool MyQueue<T,num>:OutQueue(T&obt) 45 { 46 if(QueueEmpty()) 47 return false;//如果队列已空,无法弹出,返回false 48 else 49 { 50 obt=sz[nHead]; 51 nHead=(nHead+1)%num; 52 return true;//出队成功,返回true 53 } 54 }