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

一、栈的链式存储结构

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

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

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

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; //如果在调用构造器时都…

华盈生物-20K人类蛋白组芯片的超凡应用:揭秘蛋白质的神奇世界

各位科研小伙伴们&#xff0c;欢迎再次来到我们的科学探险之旅&#xff01;今天&#xff0c;我们要深入探讨一项超级实用的科研工具——20K人类蛋白组芯片。通过这款芯片&#xff0c;你可以揭开蛋白质世界的神秘面纱&#xff0c;探索各种有趣的应用方向。准备好了吗&#xff1f…

在python中使用正则表达式

正则表达式是什么&#xff1f;就是要寻找的数据的规律&#xff0c;使用正则表达式的步骤有三 第一&#xff0c;寻找规律&#xff0c;第二使用正则符号表示规律&#xff0c;第三&#xff0c;提取信息 看下面的代码 import re wenzhang (小草偷偷地从土里钻出来&#xff0c;嫩…

Leetcode 3228. Maximum Number of Operations to Move Ones to the End

Leetcode 3228. Maximum Number of Operations to Move Ones to the End 1. 解题思路2. 代码实现 题目链接&#xff1a;3228. Maximum Number of Operations to Move Ones to the End 1. 解题思路 这一题不难分析得到&#xff0c;要获得最多的操作次数&#xff0c;只需要从左…

数据结构---散列表(哈希表)

什么是哈希表 1、哈希表&#xff08;Hash Table&#xff09;&#xff1a;也叫做散列表。是根据关键码值&#xff08;Key Value&#xff09;直接进行访问的数据结构。 2、哈希表通过「键 key 」和「映射函数 Hash(key) 」计算出对应的「值 value」&#xff0c;把关键码值映射到…

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

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

【Node.js】调试 Node.js 程序

调试 Node.js 程序可以使⽤以下⽅法&#xff1a; console.log()&#xff1a;使⽤ console.log() 打印变量或者调试信息&#xff0c;可以在控制台中查看输出的结果。debugger&#xff1a;在代码中使⽤ debugger 命令设置断点&#xff0c;当程序执⾏到该点时会暂停&#xff0c;可…

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格式图片的压…

Unity3D 如何自动点击UIElement.Button类型的按钮详解

前言 在Unity3D开发中&#xff0c;自动点击UI界面上的按钮是一个常见的需求&#xff0c;特别是在自动化测试、演示脚本或游戏AI控制等场景中。Unity的UI系统&#xff08;UGUI&#xff09;提供了灵活的接口来实现这一功能。下面将详细介绍如何在Unity中自动点击UIElement.Butto…

数据结构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运营 …

深入解析:conda 与 pip 使用全攻略

在 Python 环境管理和包管理中&#xff0c;conda 和 pip 是两种最常见的工具。了解它们之间的区别和联系&#xff0c;并掌握常用的使用命令和配置源&#xff0c;可以帮助我们更高效地管理 Python 环境和安装包。 conda 与 pip 的区别和联系 区别 包管理范围&#xff1a; cond…

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

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

Linux第三节课(基本指令)

一、补充 1. *表示可执行程序&#xff0c;例如&#xff1a; ------ ls *(显示当前目录下的所有的可执行程序) ------ ls *.c(显示当前目录下的所有的可执行的C语言程序) ------ ls test*.c(显示当前目录下的以test命名开头的所有的可执行的C语言程序) 2.rm -i 被删文件 --…

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

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

【Socket 编程】基于UDP协议建立多人聊天室

思路 对于服务端来说&#xff0c;除了要接收消息之外&#xff0c;还要实现一个路由转发模块&#xff0c;该路由转发模块可以将相应发送给所有连接的客户端。而对于客户端来说&#xff0c;除了要发送消息给聊天室&#xff0c;还要能实时看到其它所有客户端的消息。 下面来看看具…

鸿蒙笔记--动画

这一节主要了解一下鸿蒙的动画&#xff0c;动画的引入主要是为了提升用户体验、增加用户反馈和互动感、引导用户操作以及缓解等待带来的不适感。 属性动画: Index.ets Entry Component struct Index {StatewidthSize: number 100StateheightSize: number 40build() {Column…