C:数据结构之链栈(不带头)

目录

前序

准备工作

函数声明

函数接口

1.初始化

2.创造节点

[3. 判断栈空](#3. 判断栈空)

4.入栈

5.出栈

6.取栈顶元素

7.销毁栈

[8. 获取栈的元素个数](#8. 获取栈的元素个数)

总结


前序

链栈是基于单链表实现的,其实栈更加适合使用顺序表来实现的,这篇文章我们来探讨一下链栈的实现。

准备工作

老规矩,干活前先把符号都定义好了。代码如下;

cs 复制代码
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int DataType;
typedef struct stack
{
	DataType data;
	struct stack* next;
}SL;
typedef struct SLF//用来统计栈元素和插入和删除操作
{
	SL* top;
	int count;
}SLF;

结构体节点是包含节点的值,以及指针域,重命名为SL; 下面将栈顶的节点与栈中的元素封装起来:就这么简单;

函数声明

函数接口

列举出栈要实现的函数功能;

1.初始化

cs 复制代码
//进行初始化
void SLinit(SLF* e)
{
	assert(e);
	e->count = 0;;
	e->top = NULL;
}

2.创造节点

cs 复制代码
//创造节点
SL* creat(DataType x)
{
	SL* node = (SL*)malloc(sizeof(SL));
	if (node ==  NULL)
	{
		perror("malloc fail!");
		exit(1);
	}
	node->data = x;
	node->next = NULL;
	return node;
}

3. 判断栈空

cs 复制代码
//判断栈空
bool SLempty(SLF* e)
{
	return e->count ? false : true;
}

4.入栈

cs 复制代码
//入栈
void SLpush(SLF* e,DataType x)
{
	//创造节点
	SL* cur = creat(x);
	if (e->count == 0)//如果栈为空,那么把第一个创造的节点当成头结点
	{
		e->top = cur;
		e->count++;
	}
	else
	{
		cur->next = e->top;//如果栈不为空,新节点指向前一个节点,新节点作为尾节点,但是是栈顶;
		e->top = cur;//重新指向栈顶元素
		e->count++;
	}
}

5.出栈

cs 复制代码
//删除栈顶元素(出栈)
void SLpop(SLF* e)
{
	SL* delete = e->top;
	e->top = e->top->next;
	free(delete);
	e->count--;
}

6.取栈顶元素

cs 复制代码
//取出栈顶元素
DataType SLtop(SLF* e)
{
	return e->top->data;//直接返回元素
}

7.销毁栈

cs 复制代码
//销毁栈
void SLdestory(SLF* e)
{
	while (e->count != 0)
	{
		SL* pre = e->top;
		e->top = pre->next;
		free(pre);
		e->count--;
	}
	return;
}

8. 获取栈的元素个数

cs 复制代码
//获取栈的元素个数
int SLsize(SLF* e)
{
	return e->count;
}

总结

链栈的实现大致就是这样,我把源码放在了下面,希望对大家有所帮助;

test_c: 测试仓库 - Gitee.com

相关推荐
努力写代码的熊大4 小时前
List迭代器和模拟(迭代器的模拟)
数据结构·windows·list
长路归期无望6 小时前
C语言小白实现多功能计算器的艰难历程
c语言·开发语言·数据结构·笔记·学习·算法
dragoooon348 小时前
[优选算法专题三.二分查找——NO.24搜索旋转排序数组中的最⼩值]
数据结构·leetcode·动态规划
Haooog8 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树
那我掉的头发算什么10 小时前
【数据结构】双向链表
java·开发语言·数据结构·链表·intellij-idea·idea
半桔10 小时前
【STL源码剖析】从源码看 list:从迭代器到算法
java·数据结构·c++·算法·stl·list
拾光Ծ10 小时前
【C++】STL之list模拟实现:关于链表容器的双向迭代器你知道多少?
开发语言·数据结构·c++·list·visual studio
轩源源10 小时前
双向链表,这也太简单了吧!(C语言实现)
c语言·数据结构·算法·链表·青少年编程
暴力求解11 小时前
数据结构---栈和队列详解(上)
开发语言·数据结构·c++
小胖xiaopangss13 小时前
栈的压入弹出序列--牛客
数据结构·c++·算法