零、说明
- 与顺序栈相比优点在于空间不受限
- 注意:栈的每一层指向它的下面的一层
一、数据类型
由于第一个结构体只是栈的每一层,没法加入top,所以采用两个结构体,下面包含上面
typedef struct Stacknode
{
int data;
struct Stacknode *next;
}Stacknode,*Stackptr;
typedef struct Linkstack
{
Stackptr top;//指向栈顶
int num;//栈中元素的数量
}Linkstack;
二、初始化
void Initial(Linkstack *S)
{
S->top=new Stacknode;
S->top->next=S->top;
S->num=0;
}
三、入栈出栈
主要理解的地方在理解每层的指针都是指向前一层,最终指向栈底,而不是像链表一样指向后面新加入的
- 入栈
这边就没有空间限制导致cout<<“FULL”;了
void Push(Linkstack *S,int data)
{
Stackptr p;
p=new Stacknode;
p->data=data;
p->next=S->top;//新建一个节点接上去
S->top=p;//记住S的top还要变化
S->num++;
}
- 出栈
int Pop(Linkstack *S)
{
int ret=-1;
if(S->num!=0)
{
Stackptr p;
ret=S->top->data;//用来返回
p=S->top;//如果直接delete S->top,那就找不到下面一层了
S->top=S->top->next;
delete p;
}
else
{
cout<<"EMPTY"<<endl;
}
return ret;
}
- 得到栈顶
int Gettop(Linkstack *S)
{
return S->top->data;
}
四、附
附上测试的主函数
int main()
{
Linkstack S;
Initial(&S);
for(int i=1;i<=100;i++)
{
Push(&S,i);
}
Push(&S,114514);
for(int i=1;i<=100;i++)
{
cout<<Pop(&S)<<' ';
}
cout<<endl;
cout<<Gettop(&S);
return 0;
}