什么是栈
栈是一种只允许在一端进行插入或者删除的操作的线性表。
- 栈顶 :线性表允许进行插入删除的那一端。
- 栈底 :线性表不允许插入删除的那一端。
- 空栈 :不含任何元素的空表。
栈的性质
- 栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为。 这个公式也叫做卡特兰数。
- 数据是先进后出的。
类结构
栈也可以分别由顺序和链式两种结构存储,此处实现栈时利用了之前实现的顺序表(即顺序结构) 。 以下为代码
template <typename T>
class Stack {
private:
CArrayList list;
public:
//获取栈内元素个数
int getLength();
//判断栈是否为空
bool isEmpty();
// 压栈
bool push(const T e);
//弹栈
bool pop(T& e);
//读栈顶元素
T &getTop();
};
由于栈本质上就是一个受限的线性表,故只需要对顺序表进行封装即可。
支持的一些方法
template<typename T>
int Stack<T>::getLength() {
return this->list.GetLength();
}
template<typename T>
bool Stack<T>::isEmpty() {
if (this->list.length==0){
return true;
}
return false;
}
template<typename T>
bool Stack<T>::push(const T e) {
this->list.ListInsert(this->list.length+1,e);
return true;
}
template<typename T>
bool Stack<T>::pop(T &e) {
this->list.ListDelete(this->list.length,e);
return true;
}
template<typename T>
T &Stack<T>::getTop() {
if(this->isEmpty()){
cout<<"栈空"<<endl;
}
return this->list[this->list.length];
}
栈的其它实现
- 共享栈:共享栈是一个连续的内存空间,两端作为两个栈的栈底,栈顶都向共享空间的中间延伸。
- 栈的链式存储:链式存储的栈一般使用单链表实现,并且规定所有的操作都在表头进行。链栈没有头节点,即头指针指向栈顶。
总结
栈在计算机中有着广泛的应用,例如在程序调用时会形成一个程序调用栈,在返回时找到进行函数调用的函数。