链式栈

本文详细介绍了链式栈的数据结构,包括头文件、源文件及测试文件的实现,探讨了链式栈在程序设计中的重要作用。
摘要由CSDN通过智能技术生成

1.0 头文件

#pragma once

typedef int elemType;

// 链式栈 的一个元素
typedef struct LinkStatckNode
{
	elemType data;
	struct LinkStatckNode* nextNode;
}LinkStatckNode,*LinkStatckNodePtr;

// 栈的结构体
typedef struct LinkStatckPtr
{
	// 栈顶指针
	LinkStatckNodePtr top;
	// 栈的长度
	int length;
}LinkStatckPtr;

// 初始化栈
void initLinkStack(LinkStatckPtr** s);

// 压入一个元素
void pushLinkStack(LinkStatckPtr* s, elemType e);

// 弹出一个元素
void popLinkStack(LinkStatckPtr* s, elemType* e);

// 获取栈顶元素
void getTopLinkStatk(LinkStatckPtr* s, elemType* e);

// 获取栈的长度
int getLinkStatkLength(LinkStatckPtr* s);

// 判断栈是不是为空
bool isEmptyLinkStatk(LinkStatckPtr* s);

2.0 源文件

#include "LinkStatck.h"

#include<stdio.h>
#include<stdlib.h>

// 初始化栈
void initLinkStack(LinkStatckPtr**  s)
{
	// 1.0 生成头指针
	*(s) = (LinkStatckPtr* )malloc(sizeof(LinkStatckPtr));
	if (!(*s))
	{
		exit(-1);
		return;
	}
	(*(s))->top = NULL;
	(*(s))->length = 0;
}

// 压入一个元素
void pushLinkStack(LinkStatckPtr* s, elemType e)
{
	//1.0 生成一个节点
	LinkStatckNode* node = (LinkStatckNodePtr)malloc(sizeof(LinkStatckNode));
	if (!node)
	{
		return;
	}
	// 赋值新节点的数据
	node->data = e;
	node->nextNode = NULL;

	s->length = s->length + 1;
	// s->top = node;
	// 分两种情况 栈是空的
	if (s->top == NULL)
	{
		s->top = node;
	}
	else
	{
		// 这两句不好理解可以画图,一图胜千言
		node->nextNode = s->top;
		s->top = node;
	}

}

// 弹出一个元素
void popLinkStack(LinkStatckPtr* s, elemType* e)
{
	if (s->top == NULL)
	{
		*e = -1;
		return;
	}
	// 先获取 top 指针指向的节点
	LinkStatckNodePtr node = s->top;
	*e = node->data;
	s->top = s->top->nextNode;
	s->length = s->length - 1;
	free(node);
}

// 获取栈顶元素
void getTopLinkStatk(LinkStatckPtr* s, elemType* e)
{
	if (s->top == NULL)
	{
		*e = -1;
	}
	*e = s->top->data;
}


// 获取栈的长度
int getLinkStatkLength(LinkStatckPtr* s)
{
	return s->length;
}

// 判断栈是不是为空
bool isEmptyLinkStatk(LinkStatckPtr* s)
{
	if (s != NULL)
	{
		return (s->length == 0 || s->top == NULL);
	}
	else
	{
		return true;
	}
	
}

3.0 测试文件

/*
* 测试 文件
*/
#include<stdio.h>

#include"LinkStatck.h"

int main(int  argc, char*  argv[])
{
	printf("Hello World! Stack\n");


	LinkStatckPtr* s;
	initLinkStack(&s);

	pushLinkStack(s, 100);
	pushLinkStack(s, 101);
	pushLinkStack(s, 102);

	int e;
	popLinkStack(s, &e);
	printf("popLinkStack %d \n", e);

	popLinkStack(s, &e);
	printf("popLinkStack %d \n", e);


	getTopLinkStatk(s, &e);
	printf("popLinkStack %d \n", e);

	popLinkStack(s, &e);
	printf("popLinkStack %d \n", e);

	popLinkStack(s, &e);
	printf("popLinkStack %d \n", e);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值