用链表写栈比数组要简单,只要创建1个头指针代表链表就可以了
链式栈大小由你自己压入栈的多少来确定,没有固定大小
#include <iostream>
using namespace std;
template <class T>
class Stacklink
{
protected:
typedef struct stack //定义了一个结构体
{
T data; //存放值
struct stack * next; //指针
}Stack,*Link;
Link top; //创建一个栈顶指针,来当作链式栈的头节点
public:
Stacklink(); //构造函数
~Stacklink(); //析构函数
bool isEmpty(); //判断栈是否为空,因为是链式栈所以不用判断为满
T push(const T& t); //入栈操作
T pop(T & t); //出栈操作
};
template<class T>
Stacklink<T>::Stacklink()
{
top = new Stack; //为头节点分配内存空间
top->next = NULL;
}
template<class T>
Stacklink<T>::~Stacklink()
{
delete []top; //释放掉头节点
top = NULL;
}
template<class T>
bool Stacklink<T>::isEmpty()
{
return top->next == NULL; //判断栈是否为空,头节点不算
}
template<class T>
T Stacklink<T>::push(const T &t) //链表入栈时不用判断是否为满
{
Link p = top->next;
Link q = new Stack; //给新节点分配内存
if( q != NULL) //判断内存空间是否分配成功
{
top->next = q; //利用头插,就相当于入栈
q->next = p;
q->data = t;
return t;
}
cout << "error..." << endl;
exit(0);
}
template<class T>
T Stacklink<T>::pop( T &t)
{
if(!isEmpty()) //先判断是否为空
{
Link p = top->next;
t = p->data; //把值传出来
top->next = p->next; //释放掉节点
free(p);
return t;
}
cout << "Stack is empty!" << endl;
exit(0);
}
int main()
{
Stacklink<double> s;
double i;
for(i = 0.5; i < 10; i++) //压入10个值
{
cout << s.push(i) << endl;
}
cout << "-----------" << endl;
while(!s.isEmpty())
{
cout << s.pop(i) << endl;
}
return 0;
}