之前已经写过一篇关于栈的,最近刚学了模板类的知识顺带复习一下栈。
栈:FILO first in last out 简明的一句话就能概括所有的点了,但关于栈的应用还需多练多加体会。
模板类相较于typedef的优势在于多种数据类型可以混用而不受限制,STL里的队列,栈等数据结构都是模板类实现的,可以同时声明int型,char型等不同数据类型值的高级数据结构。实现起来也很容易却方便了很多,下面以栈为例,写一个模板类:
static const CAPACITY=100;
template <class Item>
class Stack{
public:
typedef Item value_type;
typedef std::size_t size_type;
Stack(size_type volume=CAPACITY){
size = volume;
data = new value_type[size];
top = 0;
}
~Stack(){ delete []data; }
bool push(const Item& value){
if(top>size-1){ return false; }
data[top] = value;
top++;
return true;
}
bool pop(){
if(isempty()){ return false; }
top--;
return true;
}
Item top() const {
if(isempty()){ return null;}
return data[top];
}
bool isempty() const{
if(top==0){ return true;}
return false;
}
private:
value_type* data;
size_type size,top;
};
在类的成员函数内部,通过Item定义的数据类型可以直接拿来用,但在类外则需要typename关键字来告诉编译器这是一种数据类型,类名+< Item >以表示这是一个模板类。
区别列在下表:
在非模板类中 | 模板类中 |
---|---|
value_type | Item |
size_type(成员函数内) | size_type |
size_type(成员函数外) | typename 类名< Item >::size_type |
这次学的堆的内容会在二叉树那一节整理出来、ここまでよ。