数据结构之链栈

栈介绍?

 首先,它是一个线性表,准确的说,应该是一个插入、删除受限制的线性表。

它仅仅在表尾进行插入和删除操作的线性表,我们把这种受限制的线性表称为栈。

如果栈的元素在使用时出现了元素变化不可预测的情况,有时很大,有时又很小,这种情况下,则建议使用链栈。

栈作用?

栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,要更加聚焦于我们要解决的问题核心。

既然是一种线性表,在理解之前,先将线性表的操作理解透彻。

进栈:

在栈的顶部进行入栈。

       实现代码:

              ptemp->next=ps->top;

              ps->top=ptemp;

退栈:

在栈的顶部进行出栈。

        实现代码:

              *vals=ps->top->data;

              ps->top=ps->top->next;

清栈:

清栈时当把栈顶的内存地址释放时,需要将下一个栈顶的内存地址先保存下来,以防找不到整个栈。

       实现代码:

              p=ptemp->next;

              free(ptemp);

完整代码:

/*
	Name: 
	Copyright: 
	Author: 红尘拂客 
	Date: 29/03/21 21:07
	Description: 链栈 
*/

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int data;
	struct node *next;
}Node,*PNODE;
typedef struct stack
{
	PNODE ptop;
	PNODE pbottom;
}STACK,*PSTACK;
void init(PSTACK ps);//初始化 
void display(PSTACK ps);//打印 
void push(PSTACK ps,int values); //进栈插入值为values 
int clear(PSTACK ps);//清空栈 成功返回1 失败返回0; 
int pop(PSTACK ps,int *values);//出栈成功返回1 失败返回0;
//int is_empty(PSTACK ps); //成功返回1 失败返回0;
/*------------- 初始化------------*/
void init(PSTACK ps)
{
	ps->ptop=(PNODE)malloc(sizeof(Node));//动态分配内存空间;
	if(NULL==ps->ptop)
	{
		printf("分配空间失败!\n");
		return;
	 }
	 else
	 {
	    ps->pbottom=ps->ptop;//开始栈顶指针指向栈底指针
		ps->ptop->next=NULL; 
		printf("栈:分配内存空间成功!\n");
	    return;
	 }
}
/*-------------进栈--------------*/
void push(PSTACK ps,int values)
{
	PNODE ptemp=(PNODE)malloc(sizeof(Node));
	if(NULL==ptemp)
	{
		printf("分配内存失败!\n");
		exit(0);
	}
	ptemp->data=values;
	//	
	ptemp->next=ps->ptop;//
	ps->ptop=ptemp;
	return;
 }
/*-------------出栈--------------*/ 
int pop(PSTACK ps,int *values)//出栈成功返回1 失败返回0;
{
	PNODE ptemp=ps->ptop;
	*values=ptemp->data;//将要删除的元素赋值给values;
	//
	ps->ptop=ps->ptop->next;//将栈顶指针向下移动一位; 
	free(ptemp);
	ptemp=NULL; 
	return 1;
 }
int clear(PSTACK ps)//清空栈 成功返回1 失败返回0; 
{
	PNODE ptemp=ps->ptop;
	PNODE p=NULL;
	if(ps->pbottom==ps->ptop)
	{
		printf("该栈是一个空栈无法执行清栈操作!!\n");
		return 0;
	}
	while(ps->pbottom!=ptemp)
	{
		p=ptemp->next;
		free(ptemp);
		ptemp=p;
	}
	ps->ptop=ps->pbottom;//此时栈已经被清空了栈顶指针指向栈底;
	//
	return 1;
}
void display(PSTACK ps)
{
	PNODE ptemp=ps->ptop;
	printf("打印如下:\n");
	while(ptemp!=ps->pbottom)
	{
		printf("%d ",ptemp->data);
		ptemp=ptemp->next;
	}
	printf("\n");
	return;
}
int main()
{
	STACK ps;
	int values,num_01,num_02;
	int result,i,y;
	printf("请输入你要入栈的个数:\n");
	init(&ps);//初始化栈; 
	
	printf("请输入你要入栈的个数:\n");
	scanf("%d",&num_01);
	for(i=0;i<num_01;i++)
	{
		printf("请输入栈顶元素值:\n");
		scanf("%d",&values);
		push(&ps,values);
	}
	//
	display(&ps);
	//
	printf("请输入你要出栈的个数:\n");
	scanf("%d",&num_02);
	if(num_02==0)
	{
		printf("栈元素为空!无法出栈!\n");
	}
	if(num_02>num_01)
	{
		printf("出栈个数超出栈中元素!\n");
		num_02=num_01;
	}
	for(i=0;i<num_02;i++)
	{
		if(pop(&ps,&result))
		{
			printf("出栈成功!出栈元素:%d\n",result);
		}
		else
		{
			printf("出栈失败!\n");
			return 0;
		}
	}
	//
	display(&ps);
	//
	getchar();
	printf("是否要进行清栈操作(Y/y)!其他则退出系统!\n");
	scanf("%c",&y);
	if(y=='y'||y=='Y')
	{
		if(clear(&ps))
		{
			printf("清栈成功\n");
			return 1;
		}
		else
		{
			printf("清栈失败!\n");
			return 0;
		}
	 }
	 display(&ps);
	 return 0; 
	
 } 

 如果内容对你学习有帮助,可以关注、点赞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值