【数据结构】栈的实现(链式栈)

news2024/10/5 14:03:17

文章目录

  • 栈的实现(链式栈)
    • 栈的定义
    • 初始化栈
    • 进栈
    • 判断是否为空栈
    • 出栈
    • 销毁栈
    • 获取栈顶元素
    • 获取栈的长度
    • 栈的打印
  • 完整代码(包括测试代码)
    • Stack.h
    • Stack.c
    • test.c

栈的实现(链式栈)

首先新建一个工程:

Stack.h(链式栈的类型定义、接口函数声明、引用的头文件)
Stack.c(链式栈接口函数的实现)
test.c(主函数、测试栈各个接口功能)

完整的代码放在后面(包括测试代码),这里就不会展示测试的效果图。大家可以自己别敲边按测试代码测试。图解会写的很详细的,么么😙

栈的定义

typedef int ElemType;		

/* 链栈结点结构 */
typedef struct StackNode
{
	ElemType data;
	struct StackNode* next;
}StackNode;

/* 链栈结构 */
typedef struct
{
	StackNode* top;
	int count;
}LinkStack;

初始化栈

在这里插入图片描述

// 初始化栈
LinkStack* Init()
{
	// 注意要给链栈分配内存
	LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
	if (p == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	p->top = NULL; // 链栈的空其实就是 top=NULL 的时候
	p->count = 0;

	return p;
}

进栈

在这里插入图片描述

// 进栈
void push(LinkStack* stack, ElemType x)
{
	assert(stack);

	StackNode* s = (StackNode*)malloc(sizeof(StackNode));
	if (s ==NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	s->data = x;
	s->next = stack->top; 
	stack->top = s; 
	stack->count++;
}

判断是否为空栈

这里可以用count是否等于0判断,也可以用stack->top=NULL来判断都可以。

// 判断是否为空栈
bool isEmpty(LinkStack* stack)
{
	assert(stack);

	return  stack->count == 0;
}

出栈

在这里插入图片描述

// 出栈
void pop(LinkStack* stack)
{
	assert(stack);

	if (isEmpty(stack))
		return ;

	StackNode* q = stack->top;
	stack->top = stack->top->next;
	free(q); 
	q = NULL;
	stack->count--;

}

销毁栈

这里需要二级指针才能置空stack,但是我为了整体的美观,我们这里每次使用完后,在函数外面主动置空 plist。

// 销毁栈
void destroy(LinkStack* stack)
{
	assert(stack);

	StackNode* p = stack->top;
	StackNode* q;

	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}

	stack->count = 0;
	q = NULL;
	free(stack);
	//stack = NULL;
	//需要主动释放置空,不然要使用二级指针
	

}

获取栈顶元素

// 获取栈顶元素
ElemType getTop(LinkStack* stack)
{
	assert(stack);

	if (stack->top == NULL)
		exit(-1);
	else
	   return 	stack->top->data;

}

获取栈的长度

// 获取栈的长度
int getLength(LinkStack* stack)
{
	assert(stack);
	return stack->count;
}

栈的打印

同顺序栈一样写在测试test.c文件中。

完整代码(包括测试代码)

Stack.h

#pragma once
#include<stdio.h>	
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>


typedef int ElemType;		

/* 链栈结点结构 */
typedef struct StackNode
{
	ElemType data;
	struct StackNode* next;
}StackNode;

/* 链栈结构 */
typedef struct
{
	StackNode* top;
	int count;
}LinkStack;



// 初始化栈
LinkStack* Init();
// 进栈
void push(LinkStack* stack, ElemType x);
// 判断是否为空栈
bool isEmpty(LinkStack* stack);
// 出栈
void pop(LinkStack* stack);
// 销毁栈
void destroy(LinkStack* stack);
// 获取栈顶元素
ElemType getTop(LinkStack* stack);
// 获取栈的长度
int getLength(LinkStack* stack);

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Stack.h"

// 初始化栈
LinkStack* Init()
{
	// 注意要给链栈分配内存
	LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
	if (p == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	p->top = NULL; // 链栈的空其实就是 top=NULL 的时候
	p->count = 0;

	return p;
}

// 进栈
void push(LinkStack* stack, ElemType x)
{
	assert(stack);

	StackNode* s = (StackNode*)malloc(sizeof(StackNode));
	if (s ==NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	s->data = x;
	s->next = stack->top; 
	stack->top = s; 
	stack->count++;
}

// 判断是否为空栈
bool isEmpty(LinkStack* stack)
{
	assert(stack);

	return  stack->count == 0;
}

// 出栈
void pop(LinkStack* stack)
{
	assert(stack);

	if (isEmpty(stack))
		return ;

	StackNode* q = stack->top;
	stack->top = stack->top->next;
	free(q); 
	q = NULL;
	stack->count--;

}



// 销毁栈
void destroy(LinkStack* stack)
{
	assert(stack);

	StackNode* p = stack->top;
	StackNode* q;

	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}

	stack->count = 0;
	q = NULL;
	free(stack);
	//stack = NULL;
	//需要主动释放置空,不然要使用二级指针
	

}

// 获取栈顶元素
ElemType getTop(LinkStack* stack)
{
	assert(stack);

	if (stack->top == NULL)
		exit(-1);
	else
	   return 	stack->top->data;

}

// 获取栈的长度
int getLength(LinkStack* stack)
{
	assert(stack);
	return stack->count;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"


int main()
{
	LinkStack* plist = Init();
	push(plist, 1);
	push(plist, 2);
	push(plist, 3);
	push(plist, 4);
	push(plist, 5);

	while (!isEmpty(plist))
	{
		printf("%d ", getTop(plist));
		pop(plist);

	}
	printf("\n");
	int len=getLength(plist);
	printf("%d\n", len);

	bool b = isEmpty(plist);
	if (b)
	{
		printf("true\n");

	}
	else
	{
		printf("false\n");
	}
	destroy(plist);
	//主动置空
	plist = NULL;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于HTTP GET方式获取网络时间的实现

上一节&#xff0c;我们介绍了基于NTP服务器获取网络时间的例子&#xff0c;但在有些情况下&#xff0c;比如我最近在使用RNDIS协议通过4G模块上网&#xff0c;这个协议不支持UDP协议&#xff0c;所以就用不了NTP服务器。或者有时候我们需要有更多的网络时间获取方式&#xff0…

Transformers实战01-开箱即用的 pipelines

文章目录 简介安装pipelines图片转文本文本生成情感分析零训练样本分类遮盖词填充命名实体识别自动问答自动摘要 pipeline 背后做了什么&#xff1f;使用分词器进行预处理将预处理好的输入送入模型对模型输出进行后处理 简介 Transformers 是由 Hugging Face 开发的一个 NLP 包…

群辉部署小雅alist实现视听盛会

最近群辉搭建起来了&#xff0c;开始整蛊影视库&#xff0c;之前搞过nastool。这次折腾下小雅alist。 1.下载并安装 直接在群辉的docker里面下载映像 主要映射下端口和文件夹 #token mytoken.txt 获取地址&#xff1a;https://alist.nn.ci/zh/guide/drivers/aliyundriv…

牛客网刷题 | BC84 牛牛学数列2

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 这次牛牛又换了个数…

《控制系统实验与综合设计》综合四至六(含程序和题目)

1.电机模型辨识实验 1.1 实验目的 &#xff08;1&#xff09;掌握一阶系统阶跃响应的特点&#xff0c;通过实验加深对直流电解模型的理解&#xff1b; &#xff08;2&#xff09;掌握系统建模过程中参数的整定&#xff0c;体会参数变化对系统的影响&#xff1b; &#xff0…

SpringBoot解决CORS跨域——WebMvcConfigurationSupport

前端请求后端报错了。 状态码&#xff1a;403 返回错误&#xff1a;Invalid coRs request 增加配置类WebMvcConfig Configuration public class WebMvcConfig extends WebMvcConfigurationSupport {Overridepublic void addCorsMappings(CorsRegistry registry) {// 允许跨域…

JavaScript异步编程——10-async异步函数【万字长文,感谢支持】

异步函数&#xff08;用 async 声明的函数&#xff09; 异步函数的定义 使用async关键字声明的函数&#xff0c;称之为异步函数。在普通函数前面加上 async 关键字&#xff0c;就成了异步函数。语法举例&#xff1a; // 写法1&#xff1a;函数声明的写法async function foo1(…

杨校老师项目之基于单片机STC89C52的智能环境监测系统【嵌入式】

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 技术&#xff1a;C语言、单片机等 摘要&#xff1a; 此设计可分为三个主要部分。此中的温度和湿度的检测功能&#xff0c;通过操纵单总线型温湿度传感器DHT11以数字形式显示&#xff0c;实现了切确测得温湿度的功能…

Python | Leetcode Python题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution:def grayCode(self, n: int) -> List[int]:ans [0] * (1 << n)for i in range(1 << n):ans[i] (i >> 1) ^ ireturn ans

uniapp 实现下拉刷新 下滑更新

效果图 在app或者小程序中向下滑动 会出现刷新数据 ,而上拉到底 需要更新数据 功能实现 主要俩种方式 依赖生命周期 在page.json中开启 page.json "style" : {"navigationBarTitleText" : "小小练习","backgroundTextStyle": &qu…

Linux环境部署与命令技巧

Linux环境部署与命令技巧 安装Java 首先确保已经安装了Java。通过运行以下命令检查Java是否已安装&#xff1a; java -version # 查看Java版本如果未安装Java&#xff0c;可以使用以下命令安装OpenJDK&#xff1a; sudo yum install java-11-openjdk # 安装OpenJDK 11创建一个…

用Swagger(工具Knife4j )代替postman来进行构建、测试和调试 API

什么是Swagger&#xff1f; Swagger 是一个用于设计、构建和文档化 RESTful Web 服务的开源框架。它允许开发者设计 API&#xff0c;然后生成对应的 API 文档&#xff0c;提供给团队成员或者第三方开发者查阅。Swagger 的核心是 OpenAPI 规范&#xff08;之前称为 Swagger 规范…

来学习线程啦

线程的相关概念 程序 简单点说&#xff1a;程序就是我们写的代码&#xff1b;也可以理解为&#xff1a;为完成特定任务&#xff0c;用某种语言编写的一组指令的集合 进程 进程是指运行中的程序。 比如&#xff1a;我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系…

Centos 6.10 安装oracle10.2.0.1

由于阿里云机房要下架旧服务器&#xff0c;单位未购买整机迁移服务&#xff0c;且业务较老不兼容Oracle11g&#xff0c;所以新购买一台新服务器进行安装Oracle10.2.0.1 &#xff0c;后续再将数据迁移到新服务器上。 对外ip 内部ip 数据库版本 操作系统版本 实例名 源库 1…

【MATLAB】Enigma机加密原理与自实现

文章目录 什么是EnigmaEnigma机加密通信流程Enigma的物理构造Enigma的加密设置Enigma加密通信密码重新设置Enigma加密消息拼接注意 Enigma的解密分解设置Enigma解密通信密码重新设置Enigma解密消息 Enigma的弱点MATLAB自实现Enigma加密与解密Enigma_functionRotate_functiontes…

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的序列&#xff0c;每次比较相邻…

K8S内容

K8S介绍 1、故障迁移:当某一个node节点关机或挂掉后&#xff0c;node节点上的服务会自动转移到另一个node节点上&#xff0c;这个过程所有服务不中断。这是docker或普通云主机是不能做到的 2、资源调度:当node节点上的cpu、内存不够用的时候&#xff0c;可以扩充node节点&…

详细分清Session,Cookie和Token之间的区别,以及JWT是什么东西

Cookie Cookie是一种小型的文本文件&#xff0c;由网站在用户访问时存储在其计算机或移动设备上&#xff0c;Cookie主要用于跟踪、识别和存储有关用户的信息。 简单来说Cookie就是用来存储某些后端发送给前端的数据&#xff0c;例如我们登陆后&#xff0c;后端会返回一个登录…

求正方形阴影部分面积

正方形边长6&#xff0c;求阴影部分面积 xy6① vw6② 1/26v1/23x1/263③ 1/26v1/26y1/266④ ③是左下角三角形的面积&#xff0c;④是左上角三角形的面积。 求解方程组得到x2 阴影部分面积1/2*3x3.

海豚调度器如何看工作流是在哪个worker节点执行

用海豚调度器&#xff0c;执行一个工作流时&#xff0c;有时成功&#xff0c;有时失败&#xff0c;怀疑跟worker节点环境配置不一样有关。要怎样看是在哪个worker节点执行&#xff0c;在 海豚调度器 Web UI 中&#xff0c;您可以查看任务实例&#xff0c;里面有一列显示host&a…