程序员社区

栈的链式存储

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1024
//节点的结构体
struct stackNode 
{
	//只维护指针域
	stackNode* next;
};
//栈的结构体
struct lstack 
{
	//这里头节点不写成指针形式,是因为栈的结构体会开辟在堆区
	//如果头节点用指针形式表示,就要用头节点指针指向一个开辟在堆区的头节点
	//这样释放的时候会很麻烦
	stackNode pheader;
	int size; //长度
};
typedef void* seqStack;
//栈的初始哈
seqStack init_stack()
{
	//先在堆区开辟一块内存存放栈的结构体
	lstack* stack = (lstack*)malloc(sizeof(lstack));
	//判断空间开辟是否成功
	if (stack == NULL)
		return NULL;
	//栈的初始化
	stack->pheader.next = NULL;
	stack->size = 0;
	return stack;
}
//入栈:头插
void push_stack(seqStack stack,void* data)
{
	if (stack == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	lstack* mystack = (lstack*)stack;
	//只获取用户传入自定义类型前面四个字节的大小,即得到指针域接口
	stackNode* newNode = (stackNode*)data;
	//头插
	newNode->next = mystack->pheader.next;
	mystack->pheader.next = newNode;
	//长度++
	mystack->size++;
}
//出栈:头删
void pop_stack(seqStack stack)
{
	if (stack == NULL)
		return;
	lstack* mystack = (lstack*)stack;
	//头删
	stackNode* firstNode = mystack->pheader.next;
	mystack->pheader.next =firstNode->next;
	//free(mystack->pheader.next) 错误,因为不知道用户传入的数据是咋堆区还是栈区创建
	//长度--
	mystack->size--;
}
//返回栈顶元素
seqStack top_stack(seqStack stack)
{
	if (stack == NULL)
		return NULL;
	lstack* mystack = (lstack*)stack;
	if (mystack->size == 0)
		return NULL;
	return mystack->pheader.next;
}
//返回栈的大小
int size_stack(seqStack stack)
{
	if (stack == NULL)
		return NULL;
	lstack* mystack = (lstack*)stack;
	return mystack->size;
}
//判断栈是否为空
bool empty_stack(seqStack stack)
{
	if (stack == NULL)
		return true;
	lstack* mystack = (lstack*)stack;
	if (mystack->size == 0)
		return true;
	return false;
}
//销毁栈
void destroy_stack(seqStack stack)
{
	if (stack == NULL)
		return;
	free(stack);
	stack = NULL;
}
//测试代码:
//--------------------------------------------
struct person
{
	void* next;
	char name[32];
	int age;
};

int main()
{
	seqStack stack=init_stack();
	person p1 = {NULL,"大忽悠",19 };
	person p2 = { NULL,"like",18 };
	person p3 = {NULL,"小朋友",19 };
	//入栈
	push_stack(stack, &p1);
	push_stack(stack, &p2);
	push_stack(stack, &p3);	
	if (empty_stack(stack))
	{
		printf("栈为空\n");
	}
	else {
		printf("不为空\n");
	}
	//返回栈的元素个数
	int size = size_stack(stack);
	printf("元素个数:%d\n", size);
	//通过出栈的操作来遍历
	while (empty_stack(stack)==false)
	{
		//弹出栈顶后
		person *p=(person*)top_stack(stack);
		printf("姓名:%s\t年龄:%d\n",p->name,p->age);
		//出栈
		pop_stack(stack);
	}
	//返回栈的元素个数
	 size = size_stack(stack);
	printf("元素个数:%d\n", size);
	//销毁栈
	destroy_stack(stack);
	size = size_stack(stack);
	printf("元素个数:%d\n", size);
	return 0;
}

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 栈的链式存储

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区