C++ 实现栈

129 阅读2分钟

什么是栈

栈是一种只允许在一端进行插入或者删除的操作的线性表。

  1. 栈顶 :线性表允许进行插入删除的那一端。
  2. 栈底 :线性表不允许插入删除的那一端。
  3. 空栈 :不含任何元素的空表。

栈的性质

  1. 栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为1n+1C2nn\frac{1}{n+1}C_{2n}^{n}。 这个公式也叫做卡特兰数。
  2. 数据是先进后出的。

类结构

栈也可以分别由顺序和链式两种结构存储,此处实现栈时利用了之前实现的顺序表(即顺序结构) 。 以下为代码

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];
}

栈的其它实现

  1. 共享栈:共享栈是一个连续的内存空间,两端作为两个栈的栈底,栈顶都向共享空间的中间延伸。
  2. 栈的链式存储:链式存储的栈一般使用单链表实现,并且规定所有的操作都在表头进行。链栈没有头节点,即头指针指向栈顶。

总结

栈在计算机中有着广泛的应用,例如在程序调用时会形成一个程序调用栈,在返回时找到进行函数调用的函数。