数据结构-受限制的线性表-栈【链栈】-版本1

本文详细介绍了使用C语言实现的栈数据结构,包括栈的初始化、判断空栈、计算长度、压栈、出栈、遍历和清空操作。
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>


typedef struct Node //定义结点类型变量
{
	int data;
	struct Node* pNext;
} NODE, *PNODE;

typedef struct Stack //定义栈类型变量
{
	PNODE pTop;
	PNODE pBottom;
}STACK, *PSTACK;


//功能函数
void init_Stack(PSTACK); //初始化
bool empty(PSTACK); //判断是否为空栈
int length_Stack(PSTACK); //栈的长度
void push_Stack(PSTACK,int); //压栈(入栈)
bool pull_Stack(PSTACK, int*) ;//出栈
void clear_Stack(PSTACK); //清空
void traverse_Stack(PSTACK); //遍历

//主函数
int main(void)
{
	STACK S ;
	int val;
	
	init_Stack(&S);
	push_Stack(&S,1);
	push_Stack(&S,2);
	push_Stack(&S,3);
	push_Stack(&S,4);
	push_Stack(&S,5);
	
	traverse_Stack(&S);
	clear_Stack(&S);
	traverse_Stack(&S);
	
	/*if(pull_Stack(&S,&val))
	{
	printf("出栈成功! 出栈的元素是:%d \n", val);
	}
	else
	printf("出栈失败! \n"); */
	
	//int len = length_Stack(&S);
	//printf("len = %d \n",len);
	
	
	return 0;
}


void init_Stack(PSTACK pS) //初始化
{
	pS->pTop = (PNODE)malloc(sizeof(NODE)); //栈顶指向一个头结点
	if(pS->pTop == NULL)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}
	else
	{
		pS->pBottom = pS->pTop; //栈底也指向头结点
		pS->pTop->pNext = NULL; //结点指针域置空
	}
	
}

int length_Stack(PSTACK pS) //栈的长度
{
	PNODE p = pS->pTop;
	int len = 0;
	
	while(p != pS->pBottom)
	{
		pS->pTop = p->pNext;
		len++;
		p = p->pNext;
	}
	
	return len;
}

bool empty(PSTACK pS) //判断是否为空栈
{
	if(pS->pTop == pS->pBottom)
	{
		return true;
	}
	else
		return false;
}

void push_Stack(PSTACK pS,int val) //压栈(入栈)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE)); //生成一个新结点
	
	pNew->data = val; //存入变量的值
	pNew->pNext = pS->pTop;  //新结点指向栈顶结点
	pS->pTop = pNew;
}

bool pull_Stack(PSTACK pS, int* pVal) //出栈
{
	if( empty(pS) )
	{
		return false;
	}
	else
	{
		PNODE r = pS->pTop;
		*pVal = r->data;
		pS->pTop = r->pNext;
		free(r);
		r = NULL;
		return true;
	}
}

void traverse_Stack(PSTACK pS) //遍历
{
	PNODE p = pS->pTop; //p指向栈顶
	
	while(p != pS->pBottom)
	{
		printf("%d ", p->data);
		p = p->pNext;
	}
	printf("\n");
	
	return;
}

void clear_Stack(PSTACK pS) //清空
{
	
	if( empty(pS) )
	{
		printf("栈为空\n");
		return ;
	}
	else
	{
		PNODE p = pS->pTop;
		PNODE q = NULL;

		while( p != pS->pBottom )
		{
			q = p->pNext;
			free(p);
			p = q;		
		}
		pS->pTop = pS->pBottom;	
		printf("已清空!\n");
	}
	
	
	return ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值