C语言--栈的实现

本文详细介绍了一个使用C语言实现的栈数据结构。通过定义结构体和一系列函数,包括初始化栈、压栈、遍历栈、判断栈是否为空、出栈以及清空栈,实现了栈的基本操作。文章提供了完整的代码示例,帮助读者理解栈的工作原理和具体实现。

image

image

image

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node    // 定义一个结构体,包含数据和指向下一个节点的指针
{
	int data;
	struct Node * p_next; //指向下一个节点的指针  类型也是struct Node *
} NODE, *PNODE;

/*
	定义一个栈,包含栈顶和栈底节点
*/

typedef struct Stack
{
	PNODE p_top;
	PNODE p_bottom;
} STACK, *PSTACK;

void init_stack(PSTACK);

void push_stack(PSTACK p_stack, int value);

void traverse_stack(PSTACK p_stack);

bool is_empty(PSTACK p_stack);

bool pop_stack(PSTACK p_stack, int *value);

void clear_stack(PSTACK p_stack);

int main()
{
	STACK S; //定义一个栈 此时 p_top 和 p_bottom 是无效数据,必须初始化
	int value;

	init_stack(&S);

	push_stack(&S, 1);

	push_stack(&S, 2);

	push_stack(&S, 3);

	traverse_stack(&S);

	clear_stack(&S);

	if (pop_stack(&S, &value))
	{
		printf("pop successfully, the element is %d\n", value);
	}
	else
	{
		printf("pop failed\n");
	}

	traverse_stack(&S);
}

/*
	初始化一个stack
*/

void init_stack(PSTACK p_stack)
{
	p_stack->p_top = (PNODE)malloc(sizeof(NODE)); //为栈顶分配内存
	if (p_stack->p_top == NULL)  /*
									如果为空返回失败
								 */
	{
		printf("dynamic memory malloc failed\n");
		exit(-1);
	}
	else
	{
		/*
			栈顶节点等于栈底节点
			栈顶节点的下一个节点指向为空,需要指向新添加的节点的地址
		*/
		p_stack->p_bottom = p_stack->p_top;
		p_stack->p_top->p_next = NULL;
	}
}

/*
	压栈
*/

void push_stack(PSTACK p_stack, int value)
{
	PNODE p_new = (PNODE)malloc(sizeof(NODE)); //新申请一块空间给新的节点
	p_new->data = value;				       //新节点的值为value		
	p_new->p_next = p_stack->p_top;            //新节点的指针域指向栈顶节点 
	p_stack->p_top = p_new;                    //栈顶节点指向新节点 把新节点的地址发送给p_top

	return;
}

/*
	遍历栈中元素
*/

void traverse_stack(PSTACK p_stack)
{
	PNODE p = p_stack->p_top;

	while (p!= p_stack->p_bottom)
	{
		printf("%d ", p->data);
		p = p->p_next;
	}
	printf("\n");
}

/*
	出栈
*/

bool pop_stack(PSTACK p_stack, int *value)
{
	if (is_empty(p_stack)) //判断栈是否为空
	{
		return false;
	}
	else
	{
		/*
			思路:
				1.先将栈顶节点的值保存起来
				2.栈顶节点的指向下一个节点
				3.释放上一个地址的内存
		*/
		PNODE r = p_stack->p_top; //定义一个节点r,指向p_top 
		*value = r->data;	//r的值存入value
		p_stack->p_top = r->p_next; //栈顶指向r->p_next
		free(r); //删除元素
		r = NULL;
		return true;
	}
}

/*
	判断栈是否为空
*/

bool is_empty(PSTACK p_stack)
{
	if (p_stack->p_top == p_stack->p_bottom) //如果二者相等,则栈为空
	{
		return true;
	}
	else
	{
		return false;
	}
}

/*
	清空栈
*/
void clear_stack(PSTACK p_stack)
{
	if (is_empty(p_stack))
	{
		return;
	}
	else
	{
		PNODE p = p_stack->p_top; //定义指针p指向栈顶节点
		PNODE q = NULL;	//定义指针q
		/*
			当指针p不等于栈底节点时,释放内存
			只要p指向的还有下一个元素,q就指向下一个元素,删除p,p指向下一个元素
		*/
			while (p != p_stack->p_bottom)
			{
				q = p->p_next;
				free(p);
				p = q;
			}
		p_stack->p_top = p_stack->p_bottom;
	}
}

以上。

转载于:https://www.cnblogs.com/ykyk1229/p/9804382.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值