栈的定义是限定在表的一端进行插入和删除操作的线性表,允许插入和删除的一段称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈。总之栈具有的特点是后进先出(LIFO)。
栈和链表一样又分为顺序栈和链栈。
链栈的实现
#include <iostream>
using namespace std;
template<typename DataType>
struct Node
{
DataType data;//数据域
Node<DataType>*next;//指针域
};
template<typename DataType>
class LinkStack
{
public:
LinkStack();//构造函数,初始化一个空链栈
~LinkStack();//析构函数,释放链栈各结点的存储空间
void Push(DataType x);//入栈操作,将元素x入栈
DataType Pop();//出栈操作,将栈顶元素出栈
DataType GetTop();//取栈顶元素(并不删除)
int Empty();//判空操作,判断链栈是否为空栈
private:
Node<DataType>*top;//栈顶指针即链栈的头指针
};
template<typename DataType>
LinkStack<DataType>::LinkStack()
{
top = new Node<DataType>;//生成头结点
top->next = nullptr;//头结点的指针域置空
}
template<typename DataType>
LinkStack<DataType>::~LinkStack()
{
Node<DataType>*q = nullptr;
while(top!=nullptr)//释放链栈的每一个结点的存储空间
{
q = top;//暂存被释放结点
top = top->next;// top指向被释放结点的下一个结点
delete q;
}
}
template<typename DataType>
DataType LinkStack<DataType>::GetTop()
{
if(top==nullptr)
throw "下溢异常";
else
return top->data;
}
template<typename DataType>
void LinkStack<DataType>::Push(DataType x)
{
Node<DataType>*s = nullptr;
s = new Node<DataType>;
s->data = x;//申请结点s数据域为x
s->next = top;
top = s;//将结点s插在栈顶
}
template<typename DataType>
DataType LinkStack<DataType>::Pop()
{
Node<DataType>*p = nullptr;
DataType x;
if(top==nullptr)
throw "下溢";
x = top->data;
p = top;//暂存栈顶元素
top = top->next;//将栈顶结点摘链
delete p;
return x;
}
template<typename DataType>
int LinkStack<DataType>::Empty()
{
if(top==nullptr)
throw "下溢异常";
else
return 0;
}