数据结构入门(2)——线性表、堆栈和队列
数据结构入门——线性表、堆栈和队列
文章目录
- 数据结构入门——线性表、堆栈和队列
- 前言
- 一、线性表的链接存储
- 单链表
- 循环链表
- 双向链表
- 顺序存储和链式存储的比较
- 静态链表
- 链表经典问题实例
- 二、堆栈和队列的应用
- 栈的应用
- 进制转换
- 括号匹配
- ★算术表达式求值
- 后缀表达式求值的算法
- 中缀表达式转后缀表达式算法
- 栈混洗
- 栈混洗甄别
- 栈混洗总数
- 队列的应用
前言
本系列文章将简要介绍数据结构课程入门知识,文章将结合我们学校(吉大)数据结构课程内容进行讲述。文中算法大部分来自朱允刚老师上课的讲解,朱老师是我遇到最认真负责的老师,很有幸能成为朱老师的学生。
一、线性表的链接存储
线性表相信大家都很熟悉了,直接跳过定义和顺序存储部分来讲讲线性表的链接存储。
注:顺序存储可以看看这篇文章 数据结构之顺序表
链表中的操作和实现的代码可以看这篇数据结构之单链表详解
链接存储: 用任意一组存储单元存储线性表,一个存储单元除包含结点数据字段的值,还必须存放其逻辑相邻结点(前驱或后继结点)的地址信息,即指针字段
单链表
单链表的定义:每个结点只含一个链接域的链表叫单链表
链表的第一个结点被称为头结点(也称为表头),指向头结点的指针被称为头指针(head). 链表的最后一个结点被称为尾结点(也称为表尾),指向尾结点的指针被称为尾指针(tail)
为了对表头结点插入、删除等操作的方便,通常在表的前端增加一个特殊的表头结点,称其为哨位(哨兵)结点 。
循环链表
定义:在单链表中,使尾结点的指针指回到哨位结点,称这样的单链表为循环链表。
循环链表使我们可从链表的任何位置开始,访问链表中的任一结点。
双向链表
每个节点有两个指针域
左指针指向其前驱,右指针指向其后继;
优点:方便找节点的前驱。
顺序存储和链式存储的比较
1.空间效率的比较
顺序表所占用的空间来自于申请的数组空间,数组大小是事先确定的,当表中的元素较少时,顺序表中的很多空间处于闲置状态,造成了空间的浪费;
链表所占用的空间是根据需要动态申请的,不存在空间浪费问题,但链表需要在每个结点上附加一个指针,从而产生额外开销。
2.时间复杂性的比较
基于下标的存取 | 插入和删除 | |
---|---|---|
顺序表 |
O(1) 按下标直接存取 |
O(n) 需要移动若干元素 |
链表 |
O(N) 从头开始遍历链表 |
O(1) 只修改几个指针值 |
静态链表
静态链表作为一种编程技巧,在有指针的程序设计语言中,也有广泛的应用
链表经典问题实例
(一)已知一个带有表头结点的单链表,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。
解法一(暴力): 找到最后一个节点向前找k-1次前驱
解法二: 倒数第k个即正数第n-k+1个
解法三(双指针): 使用两个指针:p和q,先把p指向第k个元素,然后p和q同时向后遍历,当p遍历到结尾时,q正好遍历到倒数第k个。
解法三用到的双指针法是链表问题中常用的解法在学习中应重点掌握 |
---|
(二)给定两个单链表的头指针head1和head2,设计一个算法判断这两个链表是否相交,如果相交则返回第一个交点,要求时间复杂度为O(L1+L2),L1、L2分别为两个链表的长度。为了简化问题,这里我们假设两个链表均不含有环.
思路: 是否相交?如果两个链表相交,则最后一个结点一定是共有的,可以分别遍历2个链表,记录其最后一个结点和链表长度。若2个链表最后一个结点相等,则相交,否则不相交。
找相交结点?用指针p1指向较长的那个链表,p2指向较短的那个链表,p1先向后移动|L1-L2|步,然后p1和p2同时向后移动,每移动一步比较p1和p2是否相等,当二者相等时,其指向的结点即为交点。
这里只选取了两个经典问题进行分析,目的是使大家了解到双指针法在链表问题中的应用。
更多例题可以看这篇文章 链表常见面试题
关于链表中的跳表的问题可能会另开一章介绍
数据结构入门(2)——线性表、堆栈和队列相关推荐
- Java版数据结构与算法——线性表
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...
- 大话西游之王道考研数据结构第一讲---线性表的顺序表示
大话西游之王道考研数据结构第一讲---线性表的顺序表示 写在前面的话 王道考研数据结构是一本非常好的书,本系列所有的内容是按照其书进行讲述的,所以您可以以那本书作为主要内容,这个做参考. 大学时候,在 ...
- 【数据结构】除去线性表中的重复数字
题目:写一个算法将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同. 刚看到这个题目给我第一个思路是冒泡排序,可以利用冒泡排序的两层循环找出相同的结点,然后free掉.第一层循环是控制循环的 ...
- Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题
文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...
- 数据结构复习题(线性表)
数据结构复习题(线性表) 线性表 选择题 填空题 判断题 解答题 顺序表的插入和删除 单链表的插入与删除,创建 线性表 选择题 用单链表方式存储的线性表,存储每个节点需要两个域,一个是数据域,另一个是 ...
- 算法与数据结构(一):线性表(C++实现)
文章目录 算法与数据结构(一):线性表(C++实现) 头文件定义线性表类的成员变量和成员函数 头文件类成员函数的实现 主函数 参考:算法分析与设计(C++描述) 石志国.刘冀伟.姚亦飞编著 算法与数据 ...
- C语言数据结构-第二章线性表-电大
第二章线性表--内容简介 本章将进入线性结构的学习. 线性结构是最简单.最常用的一种数据结构. 本章将学习线性表的定义.顺序和链式两种存储方式及相应存储结构上的运算实现.通过典型示例训练,掌握线性表的 ...
- 数据结构-线性表之用队列实现栈用栈实现队列
文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...
- 数据结构之【线性表】(顺序表、链表的基本操作实现)
概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...
- 数据结构——绪论以及线性表的顺序表示
绪论 数据类型 数据类型是一个值的集合和定义在此集合上一组操作的总称. (1)原子类型:其值不可再分的数据类型,如int,char,float. (2)结构类型:其值可以再分解为若干成分的数据类型. ...
最新文章
- 对输入框以及选择框集体的数据检验
- 现金流为王!中小企业如何“疫”境求生?
- C# GDI+ 文字操作
- android视频录制无图像,Android开发拍摄视频在图库不显示问题
- SaltStack 介绍和安装
- VS2013默认打开HTML文件没有设计视图的解决办法
- 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
- CF16E Fish(状压+期望dp)
- java 纯真ip 乱码_UTF-8使用纯真IP数据库乱码问题
- 暗通道理论详解及的Python实现
- 深度学习:走向核心素养(理论普及读本)电子书
- colorAccent,colorPrimary,colorPrimaryDark……来这里你就明白了
- 威盛wm8880 android4.2系统,还能更低吗? 威盛推出249元平板新芯片组
- 【写着玩】二维码检测及定位
- 云原生计算动态周报2.13-2.20
- CVS投中app数据采集
- 欧拉回路python
- Shader学习之Cg语言二(Cg数据类型)
- android 设计模式学习
- TP开发优秀开源的付费内容视频课程教学管理系统源码
热门文章
- Buck-Boost电路
- Amazon AWS Rekognition教程
- rsync用法详细解释
- ubuntu双系统 卸载+重装(ubuntu20.04)
- [转载]白素贞的身世之谜
- 计算机考研专业课——c语言
- HDU 6599 Palindromic_Automaton
- mysql 保存富文本的类型_富文本编辑器内容在mysql数据库以什么类型保..._网络编辑_帮考网...
- LeetCode 246. 中心对称数
- BLE Mesh中的Sequence number和IV Index