基本概述
- 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除操作,这一端被称为栈顶,相对地,另一端被称为栈底。
- 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
- 栈是限定仅在表头进行插入和删除的线性表。栈是一种先进先出结构(FIFO)。
类模板与栈
首先说几个比较容易混淆的术语
1、函数指针——指针函数
函数指针的重点是指针,表示的是一个指向函数的指针,例如int (*pf)();
指针函数的重点是函数,表示一个返回指针的函数,例如int* fun();
2、数组指针——指针数组
数组指针的重点是指针,表示一个指向数组的指针,例如int (*pa)[8];
指针数组的重点是数组,表示一个由指针组成的数组,例如int* ap[8];
3、类模板——模板类
类模板的重点是模板,表示一个专门用于产生类的模板,例如
template<typename T>
class Vector
{...};
使用这个Vector模板就可以产生很多class(类),Vector<int>、Vector<char>、Vector<Vector<int> >、Vector<Shape*>......
模板类的重点是类,表示由一个模板生成而来的类,例如上面的Vector<int>、Vector<char>、......
全是模板类。
4、函数模板——模板函数
函数模板的的重点是模板,表示一个专门用来生产函数的模板,例如
template<typename T>
void fun(T a)
{...};
在运用时,可以显式生产模板函数,fun<int>
、fun<double>
、fun<Shape *> ......
,也可以在使用的过程中由编译器进行模板参数推导来隐式生成,例如fun(6);//隐式生成fun<int> fun(8.9);、fun('a');、Shape* ps = new Circle; fun(ps);
模板函数的重点是函数,表示的是由一个模板生成而来的函数,例如上面显式或隐式生成的fun<int>、fun<Shape*>......
都是模板函数。
模板本身的使用是很受限制的,一般来说,它们就只是一个产生类和函数的模子。除此之外,运用的领域非常少了,所以不可能有什么模板指针存在的,即指向模板的指针,这是因为在C++中,模板就是一个代码的代码生产工具,在最终的代码中,根本就没有模板本身存在,只有模板具现出来的具体类和具体函数的代码存在。类模板还可以作为模板的模板参数使用。
模板的具体实现——如用来处理string对象的栈类—被称为实例化(instantiation)或具体化(specialization)。
template<class Type>
class Stack
{
private:
enum{MAX=10};
Type items[MAX]; //栈的大小固定
int top;
public:
Stack():top(0) {};
bool isempty() {return top==0;}
bool isfull() {return top==MAX;}
bool push(const Type & item);
bool pop(Type & item);
};
template<typename Type>
bool Stack<Type>::push(const Type & item)
{
if (top < Max)
{
items[top++] = item;
return true;
}
else
return false;
}
template<typename Type>
bool Stack<Type>::pop(Type & item)
{
if (top >0)
{
item = items[--top];
return true;
}
else
return false;
}