数据结构初探(一)栈与栈的应用

(一)在描述栈(stack)之前,我们先了解一下数据结构基础概念:



1、数据(data)是对客观事物的符号表示,数据元素(data element)是数据的基本单位,一个数据元素可由若干个数据项(data item)组成,数据项为数据的不可分割的最小单位数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。数据元素相互之间的关系称为结构(structure)

2、根据数据元素之间关系不同特性,通常有下列四类基本结构:

(1.)集合 机构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系;

(2.)线性结构 结构中的数据元素之间存在一个对一个的关系;

(3.)树形结构 结构中的数据元素之间存在一个对多个的关系;

(4.)网状结构或图状结构 机构中的数据元素之间存在多个对多个的关系。

3、描述数据元素之间的逻辑关系的结构称为逻辑结构。数据机构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。

在计算机中,我们用一个由若干位最合起来形成的一个位串表示一个数据元素,通常称这个位串位元素结点(node)

4、数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储机构:顺序存储机构链式存储结构数据类型(data type)是和数据结构密切相关的一个概念,是一个值得集合和定义在这个集合上的一组操作的总称。分为原子类型和结构类型。

5、抽象数据类型(Abstract Data Type,简称ADT是指一个数学模型以及定已在该模型上的一组操作:

(1.)原子类型(atomic data type)属原子类型的变量的值是不可分解的;

(2.)固定聚合类型(fixed-aggregate data type)属该类型的变量,其值由确定成分按某种结构组成;

(3.)可变聚合类型(variable-aggregate data type)构成该类型的变量其“值”的数目不确定。

6、多形数据类型(polymorphic data type)是指其值的成分不确定的数据类型。

算法(algorithm)是对特淡定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。

(二)栈(stack)是一种重要的数据结构。从数据结构角度来看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集。所以还需要了解一些关于线性表的知识:



1、线形表是一种线性结构,线性结构的特点是:

(1.)存在唯一的一个被称作“第一个”的数据元素;

(2.)存在唯一的一个被称作“最后一个”的数据元素;

(3.)除第一个之外,集合的每个数据元素均只有一个前驱

(4.)除最后一个之外,集合的每个元素均只有一个后继

2、线性表(linear_list)是最常用且最简单的一种数据结构。简言之,一个线性表是n个数据元素的有限序列。在稍复杂的线性表中,一个数据元素可以有若干个数据项(item)组成。在这种情况下,常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)

3、线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示没个数据元素与其后继元素之间的逻辑关系,除了存储其本身的信息外,还需存储一个指示其直接后继的信息。这两部分信息组成数据元素的存储映像,称为结点(node)。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称作指针或链。

4、N个结点链结成一个链表,即为线性表的链式存储结构。又由于此链表的每个结点中只包含一个指针域,故称做线性链表或单链表循环链表(circular linked list)是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域只想头结点,整个链表形成一个环。双向链表,可以双向读取数据元素的循环链表。

(三)栈和栈的应用:



1、栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。不含元素的空表称为空栈。它按照先进后出(last in first out)的原则进行,是一种LIFO结构的线性表。

2、栈的存储表示方法:

(1.)顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时附设指针top只是栈顶元素在顺序栈中的位置。习惯上用top=0表示空栈,由于栈在使用过程中所需最大空间的大小很难估计,因此,一般来说,在初始化设空栈时不应限定栈的最大容量。所以可以先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够用时再逐段扩大。为此,设定两个常量:STACK_INIT_SIZE(存储空间初始分配量)STACKINCHREMENT(存储空间分配增量)

(2.)栈的链式表示,与单链表和双向链表十分相似,不在详细描述。

3、栈的应用举例:

(1.)数值转换

将十进制数1348转换为八进制数,采用了eclipse编辑器和stack模板:

结果为:

(2.)括号匹配的检验

输入一个中括号和小括号组成的char数组,然后进行括号匹配检验:

结果为:

(3.)行编辑程序

输入一个字符串,遇到字符‘#’时删除前面的字符,遇到字符‘@’时删除前面的字符:

结果为:

(4.)迷宫求解

分别用两个stack记录x,y坐标,即可。

(5.)运算符优先级

与(3.)非常相似,后面有时间再补充。

(6.)递归

主要有八皇后问题,Hanoi问题等。

原文地址:https://www.cnblogs.com/jaczero/p/9692614.html

时间: 2024-10-10 23:52:44

数据结构初探(一)栈与栈的应用的相关文章

《大话数据结构》--- 第四章 栈与队列

栈(Stack)是限定仅在表尾进行插入和删除操作的线性表. 把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈.栈又称为后进先出的线性表,简称LIFO结构. 栈的插入操作,叫做进栈,也称压栈.入栈. 栈的删除操作,叫做出栈,也称弹栈. 当两个栈一个占用内存可能太大 但内容较少 另一个占用内存可能有剩余 可以考虑使用一个数组来存两个栈,一个底端从下标0开始,另一个底端从下标n-1开始,只要两个栈不碰头 就可以实现空间的有效利用. 栈的链式存储结构称为栈链. 如果栈的使用过

小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈

小猪的数据结构辅助教程--3.1 栈与队列中的顺序栈 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点 1.栈与队列的介绍,栈顶,栈底,入栈,出栈的概念 2.熟悉顺序栈的特点以及存储结构 3.掌握顺序栈的基本操作的实现逻辑 4.掌握顺序栈的经典例子:进制变换的实现逻辑 1.栈与队列的概念: 嗯,本节要进行讲解的就是栈 + 顺序结构 = 顺序栈! 可能大家对栈的概念还是很模糊,我们找个常见的东西来拟物化~ 不知道大家喜欢吃零食不--"桶装薯片"就可以用来演示栈! 生产的时

数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)

//  度过了上周的悲催状态,我决定好好学习了-- //书上括号匹配是栈的简单应用,正好在SDOJ上看到这道题,顺便做了下 题目地址:SDOJ 2134 数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出

浅谈算法和数据结构(1):栈和队列

浅谈算法和数据结构(1):栈和队列 2014/11/03 ·  IT技术                                         · 2 评论                                      ·  数据结构, 栈, 算法, 队列 分享到: 60 SegmentFault D-Day 2015 北京:iOS 站 JDBC之“对岸的女孩走过来” CSS深入理解之relative HTML5+CSS3实现春节贺卡 原文出处: 寒江独钓   欢迎分享原创

小猪的数据结构辅助教程——3.2 栈与队列中的链栈

小猪的数据结构辅助教程--3.2 栈与队列中的链栈 标签(空格分隔): 数据结构 1.本节引言: 嗯,本节没有学习路线图哈,因为栈我们一般都用的是顺序栈,链栈还是顺带提一提吧, 栈因为只是栈顶来做插入和删除操作,所以较好的方法是将栈顶放在单链表的头部,栈顶 指针与单链表的头指针合二为一~所以本节只是讲下链栈的存储结构和基本操作! 2.链栈的存储结构与示意图 存储结构: typedef struct StackNode { SElemType data; //存放的数据 struct StackN

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名 代码如下: #i

15、蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题

15.蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题 本篇名言:"人的一生应当这样度过:当回忆往事的时候,他不致于因为虚度年华而痛悔,也不致于因为过去的碌碌无为而羞愧:在临死的时候,他能够说:"我的整个生命和全部精力,都已经献给世界上最壮丽的事业--为人类的解放而斗争." 继续递归问题,本次是经典的八皇后问题: 欢迎转载,转载请标明出处: 1.  八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

14.蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数 本篇名言:"今天就是生命 ----- 是唯一你能确知的生命." 继续递归应用,阿克曼函数. 欢迎转载,转载请标明出处: 1.  阿克曼函数 阿克曼函数(Ackermann)是非原始递归函数的例子.它需要两个自然数作为输入值,输出一个自然数.它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算. Ackermann函数定义如下: 若m=0,返回n+1. 若m>0且n=0,返回Ackermann(m-1,1

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一