链栈(结构体模板)
声明:图片及内容基于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;
}