栈类模板的使用 (用多文件程序编写)
//注意事项 类模板的声明和定义都要写在头文件里,否则发生错误
#include<iostream>#include<string.h>
using namespace std;
template<typename Type>
class Stack
{
public:
Stack(int=10);
~Stack()
{
delete stackPtr;
}
int push(const Type&);
int pop(Type&);
int isFull() const
{
return top==size-1;
}
int isEmpty() const // const 放在函数后表示这个函数是常成员函数, 常成员函数是不能改变成员变量值的函数
{
return top==-1;
}
private:
int size;
int top;
Type* stackPtr;
};
template<typename Type>
Stack<Type>::Stack(int s)
{
size=(s>0&&s<1000?s:10);
top=-1;
stackPtr=new Type[size];
}
template<typename Type>
int Stack<Type>::push(const Type& item)
{
if(!isFull())
{
stackPtr[top++]=item;
return 1;
}
return 0;
}
template<typename Type>
int Stack<Type>::pop(Type& popValue)
{
if(!isEmpty())
{
popValue=stackPtr[--top];
return 1;
}
return 0;
}
#include"Stack.h"
int main()
{
Stack<char> charStack; //创建字符型栈对象 charStack
char c='a';
cout<<"Pushing elements onto charStack "<<endl;
while(charStack.push(c))
{
cout<<c<<" ";
c+=1;
}
cout<<endl<<"Stack is full can not push "<<c<<endl
<<"Poping elements from charStack "<<endl;
while(charStack.pop(c))
cout<<c<<" ";
cout<<endl<<"Stack is empty can not pop "<<endl;
Stack<double> doubleStack(5); //创双精度型栈对象 doubleStack
double f=1.1;
cout<<"Pushing elements onto doubleStack "<<endl;
while(doubleStack.push(f))
{
cout<<f<<" ";
f+=1.1;
}
cout<<endl<<"Stack is full can not push "<<f<<endl
<<"poping elements from doubleStack "<<endl;
while(doubleStack.pop(f))
{
cout<<f<<" ";
}
cout<<endl<<"Stack is empty cannot pop"<<endl;
Stack<int> intStack; //创建整型栈对象 intStack
int i=1;
cout<<"Pushing elements onto intStack "<<endl;
while(intStack.push(i))
{
cout<<i<<" ";
i+=1;
}
cout<<endl<<"Stack is full cannot push "<<i<<endl
<<"poping elements from intStack "<<endl;
while(intStack.pop(i))
cout<<i<<" ";
cout<<endl<<"Stack is empty cannot pop"<<endl;
}