浅谈栈和队列的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈栈与队列的应用
摘要:数据结构是计算机中一个非常重要的分支,它是现实世界数据与计算机世界数据连接的关键,它主要涵盖两方面的内容:逻辑层面的数据结构和计算机存储数据物理层的数据结构。关于数据结构中的线性表、栈、队列,将上述两方面的内容进行介绍,进行横向的比较,从而更清楚地看到它们之间的联系与区别,并分析它们在现实计算中的应用。
关键词:线性表;堆栈;队列;应用开发
Discussion on the Application of Stack and Queue Abstract: Data structure is a very important branch of a computer,it is the key of the connection of real world data and computer world data,it mainly covers the following two contents:logic level data structure and computer data storage physical layer data structure.About the data structure of the linear list,stack,queue,it introduces the content of the above-mentioned two aspects,carries on the horizontal comparison,thus more clearly see the relationship and difference between them.And analyzes them in real in the calculation of the application.
Key words: Linear List; Stack;Queue;Application Development
0 引言
栈和队列可以看作线性表的特例,它们都具有和线性表相同的存储方式,顺序存储和链式存储,栈有顺序栈和链式栈,队列有顺序队列和链式队列。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。由于它们被广泛应用在各种软件系统中,因此在面向对象的程序设计中,它们是多型数据类型[1~2]。
1 基本概念
1.1 线性表的概念和特性
线性表是有限元素(a1,a2,a3…,an)有序序列的集合,a1,a2…,an都是完全相同结构的数据类型,同时它们之间的排列严格有序,其中任何元素都对应唯一的前驱以及唯一的后继。这样一个序列可以有查询、删除、插入队列任何位置的数据操作[3]。
1.2 栈的概念和特性
栈作为一种限定性线性表,它限定插入和删除操作都在表的同一端进行。允许插入和删除元素的一端称为栈顶,另一端为栈底;栈底固定,栈顶浮动。栈的插入操作被形象地称为进栈或入栈,删除操作称为出栈或退栈。我们只能从一端取出放入数据,即压入栈和弹出栈,所以它的顺序是“后进先出”,如图1。
作者简介:刘碧霞(1993年-),女,本科,1063384634@。
1.3 队列的概念和特性
队列与栈类似,是另一种限定性的线性表,它只允许在表的一端插入元素,而在另一端删除元素。允许插入元素的一端称为队尾,允许删除元素的一端称为队头。它的操作不同的地方是两端存、取数据,且仅仅是一端取(队头)一端存(队尾),所以它的顺序是“先进
先出”,如图2。
图1 栈图2 队列
2 存储结构
2.1 顺序结构
线性表是用一定大小的数据来存放线性表,数组长度代表线性表的长度,元素在数组的位置代表元素在线性表的位置。但对数组中元素不能跳跃插入,因为线性表中元素是顺序且连接着的,不像数组中间可以空元素。同时删除元素时,必须大量移动剩下的元素,因为必须实现其连续性。插入元素同样需要大量移动数据。因此这样存储的运行效率并不够高。所以对于有着频繁插入和删除运算的线性表,是不适合采用顺序存储的。
堆栈是类似于线性表,利用数组存储,只从这个数组的一端插入和删除数据,不存在从中间“挖”数据,故不存在大量数据移动的问题,唯一不足的是数组大小是有限的,会存在栈满的现象。如果数组大小定义过大,则又有大量存储空间没有被利用,会有资源浪费。
队列是初始存储类似于线性表,但由于只能从一边进入另一边出,所以数据会随着数据操作而不断“前进”,使队列像一条“蠕虫”一样慢慢“爬过”队列定义的全部空间,而且“爬过”的空间就无法再次得到运用。“蠕虫”爬到数组尽头之后则无法前进,而此时很可能数组前端还有大量的数据未得到使用。因此我们将一个数组看作是“相连”的,即将整个数组看做一个环形,而队列“蠕虫”则会在这个环形轨道中持续“爬动”,直到数据装满整个数据空间。但这里还有第二个问题,这样的定义之后队列空与满,指向队头的front与指向队尾的rear所处的相对位置是完全一样的。这样一个类似于“活塞”的工具,它总是紧邻队列中第一个数据元素,是可以移动的,但它本身不存放任何数据。同时将队头指针指向这个“活塞”,那么队空与队满的冲突情况就得以避免[4]。
2.2 链式结构
由于数组的静态分配、不易扩充、插入删除会有大量数据移动等种种局限性,我们引入链式存储方式。通过动态分配存储空间,最有效地利用空间。
线性表是通过动态分配,分配物理上不一定相邻的存储单元。为表示他们的连续性连接性,再在分配这个存储单元时,附加一部分存储单元——指针域(也叫链接域)来指出这个元素的后继元素的存储地址。这样前面出现的删除时间复杂度高算法效率低的问题就得到了解决。但凡事都有两面性,插入删除操作虽然高效,但它在查找上的效率却不如数组方式,它无法访问任意位置的元素,也无法根据现在所处的位置(current指针处)去访问它前面的数据。对于这些不足,我们也提出一些解决方案,通过循环链表(将尾部的链接指向线性表的头部)或通过双向链表(元素中增加指针,指针指向直接前驱元素)。这样的链式存储