数据结构——栈(链式结构)

一、栈的链式存储结构

如果一个栈存在频繁进栈和出栈操作,可以考虑链式结构。

栈的链式存储结构是指使用链表来实现栈这种数据结构。在链式存储结构中,栈的每个元素被封装成一个节点,节点之间通过指针相连,形成一个链表。栈顶元素对应链表的头部,栈底元素对应链表的尾部。这种结构可以动态地分配和管理存储空间,适合于需要频繁插入和删除操作的场景

二、栈的基本操作(链表)

1、链栈的结构

typedef char SElemType;/*栈元素结构体*/
typedef struct StackNode{SElemType data;struct StackNode *next;
}StackNode,*StackLinkList;/*链栈结构体*/
typedef struct {StackLinkList top;SElemType count;
}StackLink;

2、创建空栈

/*创建一个空栈*/
int StackInit(StackLink *S){if(!S->top){return ERROR;}S->top = (StackLinkList)malloc(sizeof(StackLinkList));S->top = NULL;S->count = 0;return OK;
}

3、插入栈顶元素

/*插入元素e为新的栈顶元素*/
int StackPush(StackLink *S,SElemType e){StackLinkList p = (StackLinkList)malloc(sizeof(StackLinkList));p->data = e;p->next = S->top;/* 把当前的栈顶元素赋值给新结点的直接后继*/S->top = p;/* 将新的结点s赋值给栈顶指针*/S->count++;return OK;
}

4、 删除栈顶元素

/*若栈不空,则删除S的栈顶元素*/
/*将栈顶结点赋值给 p使得栈顶指针下移一位,指向后一结点释放结点p*/
int StackPop(StackLink *S){if(StackEmpy(S)){return ERROR;}SElemType e = S->top->data;StackLinkList q;q = S->top;S->top = S->top->next;free(q);S->count--;return e;
}

5、清空栈元素

/*清空所有的栈元素*/
void clearStack(StackLink *S){if(!S->top){return;}StackLinkList q;while (S->count != 0){q = S->top;S->top = S->top->next;free(q);S->count--;}  
}

6、打印所有栈元素

1)按出栈顺序打印
/*打印所有的栈元素*/
void printStack(StackLink *S,char *arr,int *size){if(!S->top){return;}int i = 0;StackLinkList ptr;ptr = S->top;while (ptr != NULL){// printf("%c",ptr->data);arr[i++] = ptr->data;ptr = ptr->next;} // printf("\n");*size = i;
}
2)按入栈顺序打印

核心思想是采用递归的栈底开始向栈顶打印元素。

/*打印所有的栈元素逆序*/
void printResverStack(StackLinkList S){if(S == NULL){return;}printResverStack(S->next);printf("%c",S->data);
}

三、栈案例分析

案例:输入一串字符串,并判断该字符串是否为对称串。

代码思路:将字符串输入到栈中,并存储出栈元素到数组中,并将数组中的元素倒序输入到另一个数组中,判断两个数组元素是否一致。

代码示例:

#include "LinkStack.h"int main()
{StackLink Slist;SElemType arr[50];SElemType arr1[50];printf("本程序判断字符串是否为对称串\n");char ch;int size = 0;int j = 0;int i = 0;while (1){StackInit(&Slist);ch = '\0'; arr[50] = '\0';arr1[50] = '\0';j = 0;printf("请输入字符串(输入q或者Q结束):");while(1){ch = getchar();if(ch == '\n'||ch == 'q'||ch == 'Q'){break;}StackPush(&Slist,ch);}if(ch == 'q'||ch == 'Q'){break;}printStack(&Slist,arr1,&size);for(int i = 0;i < size;i++){arr[size-i-1] = arr1[i];}for(int i = 0;i < size;i++){if(arr1[i] != arr[i]){j = 1;break;}}if(j == 0){printf("是对称串\n");}else{printf("不是对称串\n");}}clearStack(&Slist);printf("程序结束,再见!\n");return 0;
}

运行结果:

 

四、链栈的适用情况

对比一下顺序栈与链栈,它们在时间复杂度上是一样的,均为O(1)。对于空间性能,顺序栈需要事先确定一个固定的长度,可能会存在内存空间浪费的问题,但它的 优势是存取时定位很方便,而链栈则要求每个元素都有指针域,这同时也增加了一些内存开销,但对于栈的长度无限制。所以它们的区别和线性表中讨论的一样,如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一些。

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

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

相关文章

Linux下开放指定端口

比如需要开放82端口&#xff1a; #查询是否开通 firewall-cmd --query-port82/tcp#开放端口82 firewall-cmd --zonepublic --add-port82/tcp --permanent#重新加载防火墙 firewall-cmd --reload

java学习--代码块

package com.block.test01; class Main{public static void main(String[] args) {Block block new Block("你好&#xff0c;李焕英");new Block("你好",12,24);} } public class Block {String name;int begin_time;int end_time; //如果在调用构造器时都…

SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战

概览 在 SwiftUI 的开发过程中我们常说&#xff1a;“屏幕不够&#xff0c;滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不&#xff0c;从 SwiftUI 5.0&#xff08;iOS 17&#xff09;开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…

Linux----Mplayer音视频库的移植

想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件&#xff1a;(从官网获取或者网上) 1、zlib-1.2.3.tar.gz &#xff1a;通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…

数据结构day3

一、思维导图 二、顺序表实现学生管理系统 //头文件 #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct {char name[20]; //姓名int age; //年龄double score; //分数 }datatype;//定义班级类型 typedef struct {datatype student[MAX…

CDGA数据治理:突破卡点堵点,解决确权难、流通交易难问题

随着大数据时代的来临&#xff0c;数据已成为推动社会进步和经济发展的重要力量。然而&#xff0c;数据治理中的卡点堵点问题&#xff0c;特别是确权难、流通交易难&#xff0c;正成为制约数据要素市场健康发展的瓶颈。本文将探讨这些问题&#xff0c;并提出相应的解决方案。 确…

uniapp写登陆|微信小程序登录和微信h5登录使用同一个页面

文章目录 导文微信小程序登录先写一个样式代码实现详细解释&#xff1a; 微信h5登录先写一个样式代码实现1. checkWeChatCode()2. getWeChatCode()页面获取登陆后的code 导文 微信小程序登录怎么实现&#xff1f; 微信h5登录怎么实现&#xff1f; 用uniapp写同一个页面&#xf…

CloudCampus的三种部署模式

CloudCampus的三种部署模式 本地部署 客户购买控制器 自己运营 软件永久license sns &#xff0c;将软件补丁、软件升级&#xff08;含升级版本的新特性&#xff09;、远程支持等打包在一起组成SnS年费 msp自建云部署 msp 购买控制器 msp运营 …

测试数据科学家深度学习基础知识的 45 个问题(以及解决方案)

测试数据科学家深度学习基础知识的 45 个问题(以及解决方案) 一、介绍 早在2009年, 深度学习还只是一个新兴领域。只有少数人认为这是一个富有成效的研究领域。今天,它被用于开发应用程序,这些应用程序在一段时间前被认为是困难或不可能做到的。 语音识别、图像识别、在数…

《云原生安全攻防》-- 容器攻击案例:镜像投毒与Fork炸弹

在本节课程中&#xff0c;我们将介绍两个比较有意思的容器攻击案例&#xff0c;镜像投毒与Fork炸弹。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; 镜像投毒&#xff1a;构建恶意镜像&#xff0c;诱导用户拉取镜像创建容器。 Fork炸弹&#xff1a;Fork炸弹的攻击…

sql常见50道查询练习题

sql常见50道查询练习题 1. 表创建1.1 表创建1.2 数据插入 2. 简单查询例题(3题&#xff09;2.1 查询"李"姓老师的数量2.2 查询男生、女生人数2.3 查询名字中含有"风"字的学生信息 3. 日期相关例题(6题&#xff09;3.1 查询各学生的年龄3.2 查询本周过生日的…

redis的学习(二):常见数据结构及其方法

简介 redis常见的数据结构和他们的常用方法 redis的数据结构 redis是一个key-value的nosql&#xff0c;key一般是字符串&#xff0c;value有很多的类型。 j基本类型&#xff1a; stringhashlistsetsortedSet 特殊类型&#xff1a; GEOBitMapHyperLog key的结构 可以使用…

MacOS M1 安装item2 并配置Zsh

文章目录 1 下载item22 美化item22.1 配置主题2.2 设置黑色的主题&#xff1a;2.3 配置显示状态栏 status bar 3 安装 Oh my zsh3.1 设置主题3.2 设置插件3.3 安装第三方插件1 下载仓库解压2 使用 git clone 一些常用插件以及其作用 参考 1 下载item2 MacOS自带终端&#xff0…

ontap simulator配置过程

一、下载模拟器 参考《Simulate_ONTAP_9-14-1_Installation_and_Setup_Guide.pdf》P4的指导&#xff0c;登录网站进行下载。 二、传入pve&#xff0c;并解压转换 # 解压 tar -xvf vsim-netapp-DOT9.14.1-cm_nodar.ova# 解压后的文件列表&#xff0c;其中ovf文件里定义了虚拟机…

WGS84经纬度坐标 GCJ02火星坐标 BD09百度坐标互相转换

WGS84经纬度坐标 GCJ02火星坐标 BD09百度坐标互相转换 背景&#xff1a;uniapp做的微信小程序&#xff0c;使用到了相机拍照并获取位置坐标信息&#xff1b;在腾讯地图上展示坐标点位置信息&#xff1b; 由于业务需要我们的PC端用的不是腾讯地图&#xff0c;需要使用WGS84坐标或…

《0基础》学习Python——第二十三讲__网络爬虫/<6>爬取哔哩哔哩视频

一、在B站上爬取一段视频&#xff08;B站视频有音频和视频两个部分&#xff09; 1、获取URL 注意&#xff1a;很多平台都有反爬取的机制&#xff0c;B站也不例外 首先按下F12找到第一条复制URL 2、UA伪装&#xff0c;下列图片中&#xff08;注意代码书写格式&#xff09; 3、Co…

ViT(Vision Transformer)网络结构详解

本文在transformer的基础上对ViT进行讲解&#xff0c;transformer相关部分可以看我另一篇博客&#xff08;transformer中对于QKV的个人理解-CSDN博客&#xff09;。 一、网络结构概览 上图展示了Vision Transformer (ViT) 的基本架构&#xff0c;我按照运行顺序分为三个板块进…

Rancher

文章目录 Rancher1. 安装和配置2. 服务部署和管理3. 容器自动化缩容和扩容 Rancher Rancher 是一个开源的企业级容器管理平台&#xff0c;旨在简化容器化应用的部署、管理和运维。它支持多种容器编排引擎&#xff0c;如 Kubernetes、Docker Swarm 等&#xff0c;并提供了统一的…

自动驾驶系统开发与调试:车路云一体化无人驾驶挑战赛参赛体验

点击蓝字 关注我们 在过去的几年里&#xff0c;自动驾驶技术在全球范围内吸引了大量关注。其潜力不仅在于提升行车安全&#xff0c;而且还可以改变我们的出行方式和城市规划&#xff0c;提高交通运输效率。国际汽车工程师学会&#xff08;SAE&#xff09;根据不同自动驾驶程度&…

JAVA在线文档

1.存在码 JDK21中文API 2.全栈行动派 JDK17中文API 3.mklab.cn JDK11中文API JDK8中文API JDK7-21英文API 4.docs.oracle.com JDK7-22英文文档