本次操作采用不带头结点的头插法,方便在栈顶进行入栈和出栈操作
代码如下
//栈只限于在末尾插入或者删除,建立头插法不带头结点方法较简单实现
#include <iostream>
#include <cstdlib>
using namespace std;
template<typename T>
struct Node{
T data;
Node<T> *next;
};
template<typename T>
class LinkStack{
private:
Node<T> *top; //栈顶指针
public:
LinkStack(){ top = NULL; } //构造空栈
~LinkStack();
void Push(T x); //元素入栈
T Pop(); //元素出栈
T GetTop(); //获取栈顶元素
bool StackEmpty(); //检测栈是否为空
int StackLength(); //测定栈长度
void StackTranverse(); //遍历栈中元素
};
//元素入栈(不检查栈满情况对比顺序存储结构)
template<typename T>
void LinkStack<T>::Push(T x)
{
Node<T> *s = NULL;
s = new Node<T>;
if (!s)
throw "内存分配失败 \n";
s->data = x;
s->next = top;
top = s; //成为新的栈顶指针
}
//元素出栈
template<typename T>
T LinkStack<T>::Pop()
{
if (!top) //无元素
throw "无元素 \n";
Node<T> *p = top;
T e = p ->data;
top = top->next;
delete p;
return e;
}
//获取栈顶元素
template<typename T>
T LinkStack<T>::GetTop()
{
return top->data;
}
//测定栈长度
template<typename T>
int LinkStack<T>::StackLength()
{
int cnt = 0;
Node<T> *p = top;
while (p)
{
cnt++;
p = p->next;
}
return cnt;
}
//检测栈是否为空
template<typename T>
bool LinkStack<T>::StackEmpty()
{
return StackLength() == 0;
}
//遍历栈中元素
template<typename T>
void LinkStack<T>::StackTranverse()
{
Node<T> *p = top;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
template<typename T>
LinkStack<T>::~LinkStack()
{
Node<T> *p = NULL;
while (top)
{
p = top;
top = top->next;
delete p;
}
}
int main()
{
LinkStack<int> s;
cout << "依次向栈中放入1-5的连续数:";
for (int j = 1; j <= 5; ++j) //采取头插法
s.Push(j);
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "现在执行出栈操作 \n";
cout << "出栈的元素为:" << s.Pop() << endl;
cout << "栈的长度为:" << s.StackLength() << endl;
if (s.StackEmpty())
cout << "栈为空 \n";
else
cout << "栈不为空 \n";
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "向栈中放入10和11 \n";
s.Push(10);
s.Push(11);
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "栈顶元素为:" << s.GetTop() << endl;
system("pause");
return 0;
}
运行结果如下