数据结构链式栈

news2024/10/7 10:18:56

上一节我们学习了顺序栈

我们了解到栈就是特殊的线性表

我们之前用过顺序表实现了栈 那么我们也可以用单链表的方式来实现一个链式栈

我们可以回顾一下单链表的结构

基础数据结构链表_iccoke的博客-CSDN博客 

我们可以看到简单的对尾部进行操作

很难实现时间复杂度达到O(1)

那么我们设计这样的链式栈就没有意义了

因此我们要找到一个方法让出栈和入栈的时间复杂度达到最小

我们就考虑到了单链表中对于头结点操作

时间复杂度可以达到O(1)

因此我们就把头插当作入栈 头删当作出栈

依然可以实现 先进后出 和后进先出的栈的特点 

同时可以在链式结构中达到了 O(1)

 

那么他的代码就就很简单了

我们可以直接给出 因为代码和普通单链表的重复较高

直接学习单链表的时候 我们提到过 

单链表在数据结构的学习中重要性举足轻重

#pragma once

typedef int ELEM_TYPE;
typedef struct LStack
{
	ELEM_TYPE data;//数据域
	struct LStack *next;//指针域
}LStack, *PLStack;

//链式栈的操作实现:
//初始化
void Init_LStack(struct LStack *ls);

//入栈(相当于单链表的头插)
bool Push(struct LStack* ls, ELEM_TYPE val);

//出栈(相当于单链表的头删)
bool Pop(struct LStack* ls);

//获取栈顶元素值 //获取栈顶的元素值,但是不删除
ELEM_TYPE Top(struct LStack* ls);

//判空
bool Is_Empty(struct LStack* ls);

//搜索
struct LStack* Search(struct LStack* ls, ELEM_TYPE val);

//清空
void Clear(struct LStack* ls);

//销毁
void Destroy(struct LStack* ls);

//打印
void Show(struct LStack* ls);

//获取有效值个数
int Get_length(struct LStack* ls);

但是因为我们只是来实现链式栈的结构 

因此我们的实现函数 只有 出栈 出栈 获取栈顶元素 销毁 打印 获取有效值个数  搜索 

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "list_stack.h"

//初始化
void Init_LStack(struct LStack *ls)
{
	//assert ls
	ls->next = NULL;
}

//入栈(相当于单链表的头插)
bool Push(struct LStack* ls, ELEM_TYPE val)
{
	//assert 
	struct LStack *pnewnode = (struct LStack *)malloc(1 * sizeof(struct LStack));
	assert(pnewnode != NULL);
	pnewnode->data = val;

	pnewnode->next = ls->next;
	ls->next = pnewnode;
	return true;
}

//出栈(相当于单链表的头删)
bool Pop(struct LStack* ls)
{
	//assert ls
	if(Is_Empty(ls))
	{
		return false;
	}

	struct LStack* p = ls->next;
	ls->next = p->next;
	free(p);

	return true;
}

//获取栈顶元素值 //获取栈顶的元素值,但是不删除
ELEM_TYPE Top(struct LStack* ls)
{
	//assert ls
	if(Is_Empty(ls))
	{
		return false;
	}

	return ls->next->data;
}

//判空
bool Is_Empty(struct LStack* ls)
{
	//assert

	return ls->next == NULL;
}

//搜索
struct LStack* Search(struct LStack* ls, ELEM_TYPE val)
{
	//assert
	//使用哪种for循环? 使用不需要前驱的for循环
	//而不需要前驱的for循环,指针p初始时指向第一个有效节点

	struct LStack* p = ls->next;
	for(; p!=NULL; p=p->next)
	{
		if(p->data == val)
		{
			return p;
		}
	}
	return NULL;
}

//清空
void Clear(struct LStack* ls)
{
	Destroy(ls);
}

//销毁2
void Destroy(struct LStack* ls)
{
	//assert

	struct LStack *p = ls->next;
	struct LStack *q = NULL;

	ls->next = NULL;

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

//打印
void Show(struct LStack* ls)
{
	struct LStack* p = ls->next;
	for(; p!=NULL; p=p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");
}

//获取有效值个数
int Get_length(struct LStack* ls)
{
	int count = 0;
	struct LStack* p = ls->next;
	for(; p!=NULL; p=p->next)
	{
		count++;
	}
	return count;
}

 这里比较重要的就是 两 个结点互相配合 销毁链表的方式 

还有就是 在打印统计个数 时我们使用不依赖头结点的循环

 

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

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

相关文章

JdbcTemplate

JdbcTemplateJdbcTemplate &#xff08;概念和准备&#xff09;1. 什么是 JdbcTemplate&#xff08;1&#xff09; Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作2. 准备工作&#xff08;1&#xff09;配置文件的准备&#xff08;2&#xff…

100份PDF合并还不到3分钟,这2个方法非常简单,请低调使用

PDF文件作为我们工作中最为常见的“文件格式”之一。似乎哪里都有它的身影&#xff0c;有时我们还需要对PDF文件进行编辑和处理。那么&#xff0c;在众多PDF编辑和处理操作上&#xff0c;PDF合并可以算得上使用频率很高的存在。不过大多数小伙伴们并不清楚具体的操作方式是怎样…

Feign的另一种玩法-动态Feign

1.Feign传统方式的不足 ①.在微服务架构中,当我们使用Feign传统方式进行服务调用的时候,需要在每个服务消费者中添加FeignClient接口,编写对应的方法,而且当服务生产者Handler新增方法之后,服务消费者也要在FeignClient接口中添加方法,这样的话,会有些累赘. 那么能不能在调用服…

[附源码]计算机毕业设计Node.js畅玩电竞网咖购物点餐网站(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

R语言 线性混合效应模型实战案例

介绍 最近我们被客户要求撰写关于性混合效应模型的研究报告&#xff0c;包括一些图形和统计输出。首先&#xff0c;请注意&#xff0c;围绕多层次模型的术语有很大的不一致性。例如&#xff0c;多层次模型本身可能被称为分层线性模型、随机效应模型、多层次模型、随机截距模型…

web大学生网页作业成品 蛋糕店美食餐饮网站设计与实现(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录训练营第54天|LeetCode 392.判断子序列、115.不同的子序列

参考 代码随想录 题目一&#xff1a;LeetCode 392.判断子序列 确定dp数组及其下标的含义 dp[i][j]&#xff1a;s字符串中0&#xff5e;i字符构成的子串和t字符串中0&#xff5e;j字符构成的子串的最长公共子序列的长度。 确定递推公式 dp[i][j]有两个可能的来源&#xff1a;…

内点法求最优潮流和微电网调度(风、光、蓄电池、燃油机)(Matlab实现)

目录 1 概述 2 案例 2.1算例描述 2.2 数据 3 一点小知识 4 Matlab代码实现 1 概述 由于电力系统本身的复杂性,电力潮流优化具有规模大,约束条件多和非线性的特点。通过对最优潮流的求解,最终达到优化已有资源、降低发电厂耗量成本、减少电网线路损耗、提高电力系统输电…

JSON的定义、基本使用、以及和对象之间的相互转换

json的定义与基本使用 <script>//定义jsonvar json{"name" : "张三","age" : "18岁","addr" : ["北京","上海","天津"]}//获取数据console.log(json.age)console.log(json.name)consol…

【算法】可解释机器学习-CAM / Grad_CAM(Datawhale)

可解释机器学习-CAM / Grad_CAM一、CAM1.CAM算法介绍2.CAM的特点3.CAM算法的缺点二、Grad_CAM1.Grad_CAM算法介绍2.Grad_CAM算法优点3.Grad_CAM算法缺点4.Grad_CAM算法的变种1&#xff09;Grad_CAM算法2&#xff09;ScoreCAM算法3&#xff09;LayerCAM算法一、CAM 1.CAM算法介…

jsp+ssm计算机毕业设计高铁售票管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

stack和queue

stack&#xff1a;https://cplusplus.com/reference/stack/stack/?kwstack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器…

设计模式之命令模式

Command design pattern 命令模式的概念、命令模式的结构、命令模式的优缺点、命令模式的使用场景、命令模式的实现示例、命令模式的源码分析 1、命令模式的概念 命令模式&#xff0c;即将请求封装成一个对象&#xff0c;使发出请求的责任和执行请求的责任分离开。这样两者之间…

App自动化测试【1】Appium的原理解读

1.Appium的架构原理 Appium的架构原理如图所示&#xff0c;由客户端&#xff08;Appium Client&#xff09;和服务器&#xff08;Appium Server&#xff09;两部分组成&#xff0c;客户端与服务器端通过JSON Wire Protocol进行通信。 2.Appium原理解读 客户端Client&#x…

Win10自动更新怎么永久关闭?服务、注册表、组策略、计划任务中全方位设置,永久解决!

Win10自动更新就像打不死的小强&#xff0c;不管怎么关闭&#xff0c;之后还是会自动更新&#xff0c;让不少小伙伴颇为不爽。今天通过4步&#xff0c;在服务、注册表、组策略、计划任务中全方位设置&#xff0c;彻底关闭Win10自动更新&#xff0c;感兴趣的小伙伴不妨试试吧。 …

Python:requirements.txt, environment.yml简介

文章目录简介requirements.txtenvironment.yml小结简介 最近安装了一些从github上clone下载的开源python软件包&#xff0c;经历了许许多多的酸甜苦辣。在python软件包&#xff0c;通常都会包含requirements.txt, environment.yml, setup.py三者之中某些或者全部&#xff0c;一…

11.注解开发依赖注入及管理第三方Bean

1. 注解开发依赖注入 1.1 使用Autowired注解开启自动装配模式 Service public class BookServiceImpl implements BookService {//Autowired&#xff1a;注入引用类型&#xff0c;自动装配模式&#xff0c;默认按类型装配Autowiredprivate BookDao bookDao;public void save(…

【OpenCV+Qt】实现简易视频播放器——支持进度条拖动

OpenCV实现视频播放器&#xff0c;其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat&#xff0c;然后发送到界面转换成QImage进行显示&#xff0c;而进度条拖动则用到了VideoCapture中的set函数&#xff0c;进度条则是使用Qslider&#xff1b;并且…

记录安装 fenics 的问题

因为 fenics 官方更新后可能版本会出现有时效的问题, 所以也记录一下时间. Windows 系统下安装最大的问题 2022-12-19 记录. Windows 系统下本来是想通过 Anaconda 安装 fenics 的, 创建好虚拟环境后, 利用 conda install -c conda-forge fenics 进行安装, 但是直接提示 Pack…

操作系统,计算机网络,数据库刷题笔记14

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记14 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…