函数模板
函数模板的声明格式为:
template<typename/class 类型1,typename 类型2,...>
返回类型 函数名(形参边){
函数体;
}
#include<iostream>
using namespace std;
template<typename T>
T Abs(T x){
return x<0 ? -x:x;
}
int main(){
double x=-8.6;
cout<<Abs<double>(x)<<endl;
int y=-8;
cout<<Abs<int>(y)<<endl;
}
类模板
将顺序队列类模板化
将文件名取为: SeqQueue.h
#ifndef SEQQUEUE_H
#define SEQQUEUE_H
#include<iostream>
using namespace std;
template <typename T>
class SeqQueue{
private:
int front,rear;
T *data;
int MaxSize;
public:
SeqQueue(int size=100);
~SeqQueue(){delete[] data;}
int IsEmpty();
int IsFull();
void InQueue(T x);
void OutQueue(T &x);
void Display();
};
template <typename T>
SeqQueue<T>::SeqQueue(int size){
front=rear=-1;
MaxSize=size;
data=new T[MaxSize];
}
template <typename T>
int SeqQueue<T>::IsEmpty(){
if(front == -1&&rear == -1) return 1;
else return 0;
}
template <typename T>
int SeqQueue<T>::IsFull(){
if(rear >= MaxSize-1) return 1;
else return 0;
}
template <typename T>
void SeqQueue<T>::InQueue(T x){
if(IsFull()){
cout<<"队列已满,无法入队"<<endl;
return;
}
if(IsEmpty()){
data[0]=x;
front=rear=0;
}else{
data[++rear]=x;
}
}
template <typename T>
void SeqQueue<T>::OutQueue(T &x){
if(IsEmpty()){
cout<<"队列为空,无法出队"<<endl;
return;
}
if(rear == front){
x=data[front];
front=rear=-1;
}else{
x=data[front];
for(int i=0;i<rear;i++)
data[i]=data[i+1];
rear--;
}
}
template <typename T>
void SeqQueue<T>::Display(){
if(IsEmpty()){
cout<<"队列为空,无内容输出"<<endl;
return;
}
int i=front;
while(i<=rear)
cout<<data[i++]<<" ";
cout<<endl;
}
#endif
将顺序栈类模板化
将文件名取为: SeqStack.h
#ifndef SEQSTACK_H
#define SEQSTACK_H
#include<iostream>
using namespace std;
template <typename T>
class SeqStack{
private:
int top;
T *data;
int MaxSize;
public:
SeqStack(int size=100);
~SeqStack(){delete[] data;}
int IsEmpty();
int IsFull();
void Push(T x);
void Pop(T &x);
void Display();
};
template <typename T>
SeqStack<T>::SeqStack(int size){
top = -1;
MaxSize=size;
data=new T[MaxSize];
}
template <typename T>
int SeqStack<T>::IsEmpty(){
if(top == -1) return 1;
else return 0;
}
template <typename T>
int SeqStack<T>::IsFull(){
if(top == MaxSize-1) return 1;
else return 0;
}
template <typename T>
void SeqStack<T>::Push(T x){
if(IsFull()){
cout<<"栈满,无法入栈"<<endl;
return;
}
data[++top]=x;
}
template <typename T>
void SeqStack<T>::Pop(T &x){
if(IsEmpty()){
cout<<"栈空,无法出栈"<<endl;
return;
}
x=data[top--];
}
template <typename T>
void SeqStack<T>::Display(){
if(IsEmpty()){
cout<<"栈空,无元素输出"<<endl;
return;
}
int i=top;
while(i>=0)
cout<<data[i--]<<" ";
cout<<endl;
}
#endif
类模板运用实例
将(字符)数组反转
#include<iostream>
#include "SeqQueue.h"
#include "SeqStack.h"
using namespace std;
template<typename T>
void Invert(SeqQueue<T> &Q,SeqStack<T> &S){
T x;
while(!Q.IsEmpty()){
Q.OutQueue(x);
S.Push(x);
}
while(!S.IsEmpty()){
S.Pop(x);
Q.InQueue(x);
}
}
int main(){
SeqQueue<char> Q(5);
SeqStack<char> S(5);
for(int i=1;i<5;i++)
Q.InQueue(char(64+i));
cout<<"队列初始情况:";Q.Display();
Invert(Q,S);
cout<<"队列初始情况:";Q.Display();
}
写于2020-10-29