链栈简介:栈的连接存储结构称为链栈。链栈的结点结构与单链表的结点结构相同,但是没有必要像单链表那样为了运算方便而附加一个头结点。
文章内容:初始化栈、入栈、出栈、取栈顶、判断栈是否为空等操作的代码以及实现结果截图
链栈类的定义
#include<iostream>
#include<iomanip> //使用了setw()
using namespace std;
template<class T>
struct Node
{
T data;
Node<T>*next;
};
template<class T>
class SeqStack
{
public:
SeqStack(){top=new Node<T>; top=NULL;} /*初始化一个空栈*/
~SeqStack();
void Push(T x); /*将x入栈*/
T Getpop(){ /*弹出栈顶元素*/
if(top!=NULL)
return top->data;
}
T Pop(); /*出栈*/
int Empty(){ /*判断栈是否为空*/
if(top==NULL)
{
return 1;
}
else{
return 0;
}
}
private:
Node<T>*top;
};
成语函数的定义
template<class T>
SeqStack<T>::~SeqStack()
{
Node<T>*t;
while(top!=NULL)
{
t=top;
top=top->next;
delete t;
}
}
template<class T>
void SeqStack<T>::Push(T x)
{
Node<T>*s;
s=new Node<T>;
s->data=x;
s->next=top;
top=s;
}
template<class T>
T SeqStack<T>::Pop()
{
if(top==NULL) throw"下溢";
else{
Node<T>*p;
p=new Node<T>;
p=top;
T x=p->data;
top=top->next;
delete p;
return x;
}
}
主函数
int main()
{
int w;
cout<<'\n'<<"请选择您要输入的数据类型:"<<endl;
cout<<"1.int类型"<<'\t'<<"2.char类型"<<'\n'<<endl;
cin>>w;
switch(w)
{
case 1:
{
int i;
SeqStack<int>one;
one.Push(78);
one.Push(79);
one.Push(80);
cout<<'\n'<<"请输入入栈元素"<<endl;
cin>>i;
one.Push(i);
if(one.Empty())
{
cout<<"您的栈为空!";
}
else
{
cout<<"您的栈有元素!";
cout<<'\n'<<endl;
cout<<"栈顶元素为:";
cout<<one.Getpop();
cout<<'\n'<<"弹出栈内的第一元素:";
cout<<one.Pop()<<'\t';
cout<<'\n'<<"此时栈顶元素为:";
cout<<one.Getpop();
}
}
break;
case 2:
{
char i;
SeqStack<char>one;
one.Push('a');
one.Push('b');
one.Push('c');
cout<<'\n'<<"请输入入栈元素"<<endl;
cin>>i;
one.Push(i);
if(one.Empty())
{
cout<<"您的栈为空!";
}
else
{
cout<<"您的栈不为空!"<<endl;
cout<<'\n'<<endl;
cout<<"栈顶元素为:";
cout<<one.Getpop();
cout<<'\n'<<"弹出栈内的第一元素:";
cout<<one.Pop()<<'\t';
cout<<'\n'<<"此时栈顶元素为:";
cout<<one.Getpop();
}
}
break;
}
cout<<'\n'<<endl;
return 0;
}
运行截图
心得:
1.通过自己亲自执行代码明白了为什么链栈没有栈满。
2.链栈每个元素都需要一个指针域,从而产生了结构性开销,所以当栈的使用过程中元素个数变化较大时,链栈是适宜的。
3.链栈的插入删除操作只需要处理栈顶元素即开始结点的情况,所以时间复杂度为O(1);