顺序表
3.栈
栈是一种特殊的线性表。在逻辑结构和存储结构上,栈与一般的线性表没有什么区别,但是对于允许的操作却加以限制,栈的插入和删除操作只允许在表尾的一端进行,因此,栈是操作受限的线性表。
(1)栈的抽象数据类型以及实现
栈中数据元素的类型都相同,称为栈元素。往栈里插入一个元素称为进栈(push),从栈里删除一个元素为出栈(pop)。栈也称为后进先出表(LIFO)。
栈中插入和删除的一端称为栈顶,另一端则称为栈底。栈底固定不动,栈顶不断变化。不含栈元素的栈称为空栈。
栈顶指针(top),总是指向最后一个进栈的栈元素。存放栈元素的数组称为栈空间,这片空间可以静态分配,也可以动态生成。
用类表示的栈的抽象数据类型如下:
template <class T>
class Stack
{
private:
int top; //栈顶指针
T *elements; //存放栈元素的数组
int MaxSize;
public:
Stack(int MaxSize =defaultsize); //创建栈空间,生成一个空栈
~Stack(void){delete[]elements;} //释放栈空间
int Push(const T& item);
T Pop(void);
T GetTop(void);
void MakeEmpty(void){top= -1;}
boolean IsEmpty(void)const{return boolean(top== -1);}
boolean IsFull(void)const{return boolean(top ==MaxSize-1);}
};
template<class T>
Stack<T>::Stack(int s)
{
MaxSize = s;
elements = new T[MaxSize]; //创建栈空间
top = -1; //生成一个空栈
}
进栈Push():
template<class T>
int Stack<T>::Push(const T& item) //进栈,若栈不满,则item进栈,返回0;否则返回-1;
{
if (!IsFull()){elements[++top]=item;return 0;}
else return -1;
}
出栈Pop(void):
template<class T>
Stack<T>::Pop(void) //出栈,若栈非空,则栈顶元素出栈,返回其值;否则返回NULL。
{
if (!IsEmpty())return elements[top--];
else return NULL;
}
读栈顶元素:
template<class T>
T Stack<T>::GetTop(void)
{ //读栈顶。若栈非空,则返回栈顶元素的值;否则返回NULL。
if (!IsEmpty())return elements[top];
else return NULL;
}