[数据结构]C语言实现:栈

Stack.h

#ifndef STACK_H
#define STACK_H

#include <stdbool.h>
#include <stddef.h>

typedef signed int ssize_t;

typedef struct StackNode_struct
{
	int data;
	struct StackNode_struct * Prev;
} StackNode_t;

typedef struct
{
	StackNode_t * Top;
	StackNode_t * Bottom;
	size_t Count;
} Stack_t;

bool Stack_Init(Stack_t * stack);
bool Stack_Push(Stack_t * stack, int data);
bool Stack_Pop(Stack_t * stack, int * data);
bool Stack_Top(Stack_t * stack, int * data);
bool Stack_IsEmpty(const Stack_t * stack);
ssize_t Stack_Count(const Stack_t * stack);

#endif

Stack.c

#include <stdlib.h>
#include "Stack.h"

bool Stack_Init(Stack_t * stack)
{
	StackNode_t * node = NULL;

	if(!stack)
		return false;

	node = malloc(sizeof(StackNode_t));
	if(!node)
		return false;
	
	node->Prev = NULL;
	node->data = 0;

	stack->Top = node;
	stack->Bottom = node;
	stack->Count = 0;

	return true;
}

bool Stack_Push(Stack_t * stack, int data)
{
	StackNode_t * node = NULL;

	if(!stack)
		return false;
	
	node = malloc(sizeof(StackNode_t));
	if(!node)
		return false;
	
	node->data = data;
	node->Prev = stack->Top;

	stack->Top = node;
	stack->Count++;

	return true;
}

bool Stack_Pop(Stack_t * stack, int * data)
{
	StackNode_t * node = NULL;

	if(!stack)
		return false;
	
	if(stack->Count == 0)
		return false;
	
	*data = stack->Top->data;

	node = stack->Top;
	stack->Top = node->Prev;
	stack->Count--;
	free(node);

	return true;
}

bool Stack_Top(Stack_t * stack, int * data)
{
	if(!stack)
		return false;
	
	if(stack->Count == 0)
		return false;
	
	*data = stack->Top->data;

	return true;
}

bool Stack_IsEmpty(const Stack_t * stack)
{
	if(!stack)
		return false;
	
	return stack->Count == 0;
}

ssize_t Stack_Count(const Stack_t * stack)
{
	if(!stack)
		return -1;
	
	return stack->Count;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值