C++模板

函数模板

函数模板的声明格式为:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值