链栈(结构体模板)

声明:图片及内容基于https://www.bilibili.com/video/av92711998

原理

 

具体代码实现

#include<iostream>
using namespace std;
template<class T>
struct Node {               //定义节点
    T data;
     Node<T>* next;
};
template<class T>
class LinkStack {           //定义链栈
private:
    struct Node<T>* top;    //top指针可动态分配大小
public:
    LinkStack();
    ~LinkStack();
    void push(T x);
    T pop();
    T getTop();
    bool isEmpty();
};

template<class T>
LinkStack<T>::LinkStack() {
    top = NULL;
}

template<class T>
LinkStack<T>::~LinkStack() {
    struct Node<T>* p=top;
    while (top!=NULL) {
        p = top->next;
        delete top;                   //析构函数中释放节点内存空间
        top = p;                      //原来写成struct Node<T>* p = NULL;
    }                                 //while(top!=NULL){
        top = NULL;                            //p = top;
}                                            //delete p    

template<class T>                            //top=top->next }错误(top的内存已经删了无法移动)
void LinkStack<T>::push(T x) {
    struct Node<T>* p = new Node<T>;
    p->data = x;                     //注意top移动方向,指向最新插入的节点
    p->next = top;                   //每次插入的最新的节点就是头节点
    top = p;
}

template<class T>
T LinkStack<T>::pop() {
    if (isEmpty()) return -1;
    T m = top->data;
    struct Node<T>* p = top;
    top = top->next;
    delete p;
    return  m;
}

template<class T>
T LinkStack<T>::getTop() {
    if (isEmpty()) return -1;
    return top->data;
}

template<class T>
bool LinkStack<T>::isEmpty() {
    if (top == NULL) return true;
    return false;
}
int main() {
    LinkStack<int> Istack;
    Istack.push(1);
    Istack.push(2);
    Istack.push(3);
    cout << Istack.getTop()<<endl;
    cout<<Istack.pop()<<endl;
    cout<<Istack.pop()<<endl;
    //cout<<Istack.pop()<<endl;
    if (Istack.isEmpty()) {
        cout << "empty" << endl;
    }
    return 0;
}
posted @ 2021-03-10 17:24  gonghr  阅读(210)  评论(0)    收藏  举报