链栈
没有午休习惯的我闲着没事又敲了一段代码:链栈
链栈是基于链表上的一种数据结构,是在逻辑上的一块连续的空间
你比较链表和顺序栈你会发现链栈没有top了,top只是一种思想的体现,在链栈里头结点就像是top一样,只是不会再++,- -,而是指向下一个元素
值得注意的是在进行进栈操作的时候我们采用的是头插法,为什么不采用尾插法?可以思考一下
链栈基本操作代码
#include <iostream>
#include <malloc.h>
using namespace std;
typedef char ElemType;
int n;//全局变量
typedef struct linknode
{
ElemType data;
struct linknode *next;
}LinkStNode;LinkStNode *s;
void InitStack(LinkStNode*&s)//初始化栈
{
cout<<"初始化栈"<<endl;
s=(LinkStNode*)malloc(sizeof(LinkStNode));
s->next=NULL;
}
void Push(LinkStNode*&s)//进栈
{
ElemType e;
int i=0;
LinkStNode *p;
cout<<"依次进栈的元素为:";
while (i<n)
{
cin>>e;
p=(LinkStNode*)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
i++;
}
}
void StackEmpty(LinkStNode *s)//判断栈是否为空
{
if(s->next==NULL)
{
cout<<"栈为空"<<endl;
}
else
cout<<"栈非空"<<endl;
}
void GetTop(LinkStNode*s)//得到栈顶元素
{
if(s->next!=NULL)
{
cout<<"栈顶元素为:";
cout<<s->next->data;
cout<<endl;
}
}
void Pop(LinkStNode *&s)//出栈操作
{
cout<<"出栈序列为:";
LinkStNode *p;
while(s->next!=NULL)
{
cout<<s->next->data<<" ";
p=s->next;
s->next=p->next;
free(p);
}
cout<<endl;
}
void DestroyStack(LinkStNode*&s)//释放栈
{
cout<<"释放栈";
LinkStNode *q=s,*p=s->next;
while(p!=NULL)
{
free(q);
q=p;
p=q->next;
}
free(q);
}
void Input_N()//对全局变量进行赋值
{
cout<<"请输入入栈元素的个数:";
cin>>n;
}
int main()
{
Input_N();
InitStack(s);
StackEmpty(s);
Push(s);
GetTop(s);
StackEmpty(s);
Pop(s);
StackEmpty(s);
DestroyStack(s);
return 0;
}
运行结果
我写的主函数里面没有定义,只有调用
思考 你值得拥有