1.链式栈:用链表做的堆栈
先进后出
Pop,Push,Top
2.栈:是限定仅在表尾进行插入和删除操作的线性表
链式栈:push,从下向上存入数据,pop从上向下删除数据
```cpp
#ifndef LINKEDSTACK_H_INCLUDED
#define LINKEDSTACK_H_INCLUDED
template <class T>
class LinkedStack;
template <class T>
class ChainNode//节点
{
friend class LinkedStack<T>;
private:
ChainNode(const T& theDate,ChainNode *n=0):data(theDate),next(n){}
T data;
ChainNode<T> *next;
};
template <class T>
class LinkedStack//链式栈
{
public:
LinkedStack():top(0) {}
~LinkedStack(){MakeEmpty();}
bool IsEmpty() const;
T& Top() const;
void Push(const T& e);
void Pop();//从栈顶删除数据
void MakeEmpty();
private:
ChainNode<T> *top;//栈顶
};
template <class T>
bool LinkedStack<T>::IsEmpty()const
{
return top==0;
}
template <class T>
void LinkedStack<T>::Push(const T&e)
{
top = new ChainNode<T>(e,top);//top永远指向新放进来的节点
}
template <class T>
T& LinkedStack<T>::Top() const//返回栈顶数据
{
if(this->IsEmpty())
throw "Stack is empty";
return top->data;
}
template <class T>
void LinkedStack<T>::Pop()
{
if(this->IsEmpty())
throw "Stack is empty";
ChainNode<T> *delNode = top;
top = top->next;
delete delNode;
}
template <class T>
void LinkedStack<T>::MakeEmpty()
{
while (!IsEmpty())
Pop();
}
#endif // LINKEDSTACK_H_INCLUDED
```cpp
#include <iostream>
#include "LinkedStack.h"
using namespace std;
//链式栈:先进后出push,pop,Top
int main()
{
LinkedStack<int> s;
s.Push(10);
cout << s.Top()<<endl;
s.Push(20);
cout << s.Top()<<endl;
s.Push(30);
cout << s.Top()<<endl;
s.Push(40);
cout << s.Top()<<endl;
s.Pop();
cout << s.Top()<<endl;
return 0;
}