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;
}