栈和队列3——链栈

零、说明

  1. 与顺序栈相比优点在于空间不受限
  2. 注意:栈的每一层指向它的下面的一层

一、数据类型

由于第一个结构体只是栈的每一层,没法加入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;
}

三、入栈出栈

主要理解的地方在理解每层的指针都是指向前一层,最终指向栈底,而不是像链表一样指向后面新加入的

  1. 入栈
    这边就没有空间限制导致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++;
}
  1. 出栈
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;
}
  1. 得到栈顶
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值