C语言数据结构——动态栈(代码实现)

Stack.h  文件的编写

#pragma once
#include<malloc.h>
#include<stdbool.h>

typedef int My_type;//自定义类型,这里我用int类型演示
//栈控制结构体
typedef struct Stack Stack;
typedef Stack* My_Stack;

extern Stack* Init_Stack(int size);//初始换栈
extern inline bool Empty_Stack(Stack* stack);//判断栈是否为空
extern inline int Get_DataLength(Stack* stack);//获取元素长度
extern bool Push_Stack(Stack* stack, My_type data);//入栈
extern bool Pop_Stack(Stack* stack, My_type* data);//出栈
extern bool Check_Data(Stack* stack, My_type data);//查找相应元素是否存在
extern void Destory_Stack(Stack* stack);//销毁栈内存

Stack.c文件的实现

#include"Stack.h"
//栈块内存
typedef struct Array_Buff
{
	struct Array_Buff* Pre;//单向链表指针
	My_type Buff[0];//柔性数组
}Array_Buff;

typedef struct Stack
{
	int size;//单个栈节点容量
	int Top;//栈顶指针
	int Length;//数据长度
	struct Array_Buff* Array;//指向数组的指针
}Stack;
//栈初始化
Stack* Init_Stack(int size)
{//形参:1、单位结构体数组长度;
	//兼容局部变量与指针
	if (size < 1)       return NULL;//判断栈块数组内存大小是否合法
	Stack* stack = (Stack*)malloc(sizeof(Stack));//申请栈控制结构体内存
	if (stack == NULL)  return NULL;//判断是否申请成功
	//初始化栈控制结构体数据
	stack->size = size;
	stack->Length = 0;
	stack->Array = NULL;
	return stack;
}
//判断栈是否为空
inline bool Empty_Stack(Stack* stack)
{//形参:栈结构体地址;
	return stack == NULL || stack->Array == NULL  ? true : false;
}
//获取元素长度
inline int Get_DataLength(Stack* stack)
{
	return stack != NULL ? stack->Length : 0;
}
//出栈
bool Push_Stack(Stack* stack, My_type data)
{//形参:1、栈结构体地址; 2、入栈数据地址
	if (stack == NULL)//判断栈是否合法
		return false;
	if (stack->Array == NULL||stack->Top == (stack->size-1))//判断栈是否为满或者为空
	{
		Array_Buff* Buff = (Array_Buff*)malloc(sizeof(Array_Buff)+sizeof(My_type)*stack->size);//申请柔性数组
		if (Buff == NULL)//判断是否申请成功
			return false;
		//初始化数据
		stack->Top = 0;
		Buff->Pre = stack->Array;
		stack->Array = Buff;
	}
	else
	 stack->Top++;//栈顶偏移
	stack->Length++;
	stack->Array->Buff[stack->Top] = data;//数据入栈
	return true;
}
//出栈
bool Pop_Stack(Stack* stack, My_type* data)
{//形参:1、栈结构体地址; 2、出栈数据地址空间
	if (Empty_Stack(stack))
		return false;
	*data = stack->Array->Buff[stack->Top];//数据出栈
	if (stack->Top == 0)//判断出栈后栈顶指针是否空
	{
		Array_Buff*Buff = stack->Array;
		stack->Array = Buff->Pre;//向上一个栈块偏移
		stack->Top = stack->size - 1;//重新设置栈顶指针
		free(Buff);//释放原来的栈块内存
	}
	else//如果不是
		stack->Top--;//栈顶指针向下偏移
	stack->Length--;
	return true;
}
//查找相应元素是否存在
bool Check_Data(Stack* stack,My_type data)
{//形参:1、栈结构体控制地址; 2、要比较的数据;
	if (Empty_Stack(stack))
		return false;
	int Top = stack->Top;
	Array_Buff* Buff = stack->Array;
	while (Buff!=NULL)
	{
		for (;Top>-1;Top--)
		{
			if (Buff->Buff[Top] == data)
				return true;//如果比较成功返回真
		}
		Top = stack->size - 1;
		Buff = Buff->Pre;
	}
	return false;//不存在此数据就返回假
}

//销毁栈块内存
void Destory_Stack(Stack* stack)
{
	if (stack == NULL||stack->Array==NULL)//判断栈块是否合法
		return;
	while(stack->Array!=NULL)
	{//遍历栈块并销毁
		Array_Buff* Buff = stack->Array;
		stack->Array = stack->Array->Pre;
		free(Buff);
	}
	stack->Length = 0;
}

测试代码

#include"Stack.h"
#include<stdio.h>
int main()
{
	const int Num = 1000;
	My_Stack stack = NULL;
	My_type data = 0;
	stack = Init_Stack(64);
	for(int i=0;i< Num;i++)
	  Push_Stack(stack,i);
	for (int i = 0; i < Num+1; i++)
	{
		if (Pop_Stack(stack, &data))
			printf("Pop_Stack:%d\n",data);
	}
	Destory_Stack(stack);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值