栈的顺序存储结构

 栈内每个元素的类型都是void*,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
struct SStack{
	void * data[MAX];
	int m_size;
};
typedef void* seqStack;
//初始化栈
seqStack Init_stack()
{
	struct SStack * stack = (struct SStack *)malloc(sizeof(struct SStack));
	if (stack == NULL)
	{
		return NULL;
	}
	//clear elements in the array
	memset(stack->data, 0, sizeof(void *)*MAX);
	stack->m_size = 0;
	return stack;
}
//入栈
void Push_stack(seqStack stack, seqStack data)
{
	if (stack == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	//判断栈是否满了
	//stack->不会有size,要把它还原成真实的结构体
	struct SStack * mystack = (struct SStack *)stack;
	if (mystack->m_size == MAX)
	{
		return;
	}
	mystack->data[mystack->m_size] = data;
	mystack->m_size++;//更新栈大小

}
//出栈
void pop_stack(seqStack stack)
{
	if (stack == NULL)
	{
		return;
	}
	struct SStack * mystack = (struct SStack *)stack;
	if (mystack->m_size == 0)//空栈返回
	{
		return;
	}
	mystack->data[mystack->m_size - 1] = NULL;
	mystack->m_size--;
}

//获取栈顶元素
void * Top_stack(seqStack stack)
{
	if (stack == NULL)
	{
		return NULL;
	}
	struct SStack * mystack = (struct SStack *)stack;
	if (mystack->m_size == 0)
	{
		return NULL;
	}
	return mystack->data[mystack->m_size - 1];
}
//访问栈的大小
int Size_stack(seqStack stack)
{
	if (stack == NULL)
	{
		return NULL;
	}
	struct SStack * mystack = (struct SStack *)stack;
	return mystack->m_size;
}
//判断栈是否为空
int Empty_stack(seqStack stack)
{
	if (stack == NULL)
	{
		return -1;//真,为空栈
	}
	struct SStack * mystack = (struct SStack *)stack;
	if (mystack->m_size == 0)
	{
		return 1;//空栈,为真
	}
	return 0;//不是空栈,为假
}
//销毁栈
void Destroy_stack(seqStack stack)
{
	if (stack == NULL)
	{
		return;
	}
	free(stack);
	stack = NULL;
}
//测试
typedef struct person{
	char name[40];
	int age;
}person;
void test()
{
	//prepare datas
	person p1 = { "aaa", 12 };
	person p2 = { "bbb", 13 };
	person p3 = { "ccc", 14 };
	person p4 = { "ddd", 15 };
	person p5 = { "eee", 16 };

	//初始化栈
	seqStack stack = Init_stack();
	//入栈
	Push_stack(stack, &p1);
	Push_stack(stack, &p2);
	Push_stack(stack, &p3);
	Push_stack(stack, &p4);
	Push_stack(stack, &p5);

	int size = Size_stack(stack);
	printf("栈的大小为:%d\n", size);
	while (Empty_stack(stack) == 0)
	{
		person * pTop = (person *)Top_stack(stack);
		printf("姓名是:%s,年龄是:%d\n", pTop->name, pTop->age);
		pop_stack(stack);
	}
	int size_t = Size_stack(stack);
	printf("栈的大小为:%d\n", size_t);

	Destroy_stack(stack);

}
int main()
{
	test();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值