第四章 栈与队列

一、栈的定义

栈(stack)是限定尽在表尾进行插入和删除操作的线性表

我们把允许插入和删除的一端成为栈顶(top),另一端成为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(LIFO)的线性表。

图示出栈入栈操作:

二、栈的抽象数据类型

图示栈的各项操作:

由于栈本身就是一个线性表,那么上一章我们讨论了线性表的顺序存储和链式存储,对于栈来说也是同样适用的。

三、栈的顺序存储结构及实现

来看一下栈的结构定义:

若存储栈的长度为StackSize,则栈顶位置top必须小于StackSize。当栈存在一个元素时,top等于0,因此常把空栈的判定条件定位top等于-1。

看一下示意图:

下面看一下push操作的代码:

出栈pop,代码如下:

两者都没有涉及到任何循环语句,因此时间复杂度均为O(1)。

四、栈的链式存储结构及实现

栈的链式存储结构,简称链栈。

链栈的结构代码如下:

进栈操作:

出栈操作:

上述操作也不包含循环,因此时间复杂度都是O(1)。

对于顺序栈和链栈的选择:如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好些。

五、栈的应用-递归

递归的最经典例子:(斐波那契额数列)

代码如下:

递归的定义:我们把一个直接调用自己或通过一系列的调用语句间接地调用自己得函数,称为递归函数。

递归程序最可怕的就是陷入永不结束的无穷递归中,所以,每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。

六、栈的应用-四则运算表达式求值

我们介绍一种不需要括号的后缀表达法,我们把它称为逆波兰(RPN)。

我们来看一个例子:对于运算:9+(3-1)*3+10/2,其逆波兰表达式为:9 3 1 - 3 * 10 2 / +    这种表达式是反人类的表达式,但是是顺计算机的,我们也就忍忍吧!

计算规则:从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号就将处于栈顶的两个数字出栈,进行计算,将计算结果再入栈,一直重复直到获取结果。

七、队列的定义

定义:队列是只允许在一段进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出(FIFO)的线性表。

队列的抽象数据类型:

循环队列的定义:我们把队列的这种头尾相连的顺序存储结构称为循环队列。

判断队列满的条件是:(rear+1)%QueueSize==front

计算队列长度的公式:(rear-front+QueueSize)%QueueSize

循环队列的顺序存储结构代码如下:

循环队列的初始化代码如下:

循环队列求队列长度代码如下:

循环队列的入队操作代码如下:

循环队列的出队操作代码如下:

循环队列面临着数组可能会溢出的问题,我们还要研究一下不用担心队列长度的链式存储结构。

八、队列的链式存储结构及实现

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。

链队列的结构为:

队列链式存储结构--入队操作

代码如下:

队列链式存储结构--出队操作

代码如下:

总的来说,在可以确定队列长度最大值的情况下,建议用循环队列,如果你无法预估队列的长度时,则用链队列。

九、总结回顾

栈是限定仅在表尾进行插入和删除操作的线性表。

队列是只允许在一段进行插入操作,而在另一端进行删除操作的线性表。

它们均可以使用线性表的顺序存储结构来实现,但都存在着顺序存储的一些弊端。

对于队列来说,为了避免数组插入和删除时需要移动数据,于是就引入了循环队列,使得队头和队尾可以在数组中循环变化。解决了移动数据的时间损耗,使得本来插入和删除是O(n)的时间复杂度编程了O(1)。

时间: 2024-08-29 19:38:57

第四章 栈与队列的相关文章

Java数据结构与算法(第四章栈和队列)

本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构(链表.树等等)一样,都适用于数据应用中作数据记录. 然而,本章要讲解的是数据结构和算法更多的是作为程序员的工具来运用.它们组要作为构思算法的辅助工具,而不是完全的数据存储工具.这些数据结构的生命周期比那些数据库类型的结构要短的多.在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当完成之后,它们就被销毁. 受限访问 在数组中,只要知道下标就可以访问数据项.或顺

C语言数据结构——第三章 栈和队列

三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性的数据结构. 从数据类型的角度看,它们是和线性表大不相同的两种重要的抽象数据类型,在面向对象的程序设计中,它们是多型数据类型. 3.1-栈 3.1.1-抽象数据类型栈的定义 栈:是限定仅在表尾进行插入或删除操作的线性表,又可以称为后进先出的线性表. 栈顶:栈的表尾端 栈底:栈的表头端 空栈:不含元素

简单数据结构(四)栈和队列的简单应用

     编程判断一个字符串是否是回文.回文是指一个字符序列以中间字符为基准两边字符完全相同,如字符序列" ACBDEDBCA"是回文.      算法思想:判断一个字符序列是否是回文,就是把第一个字符与最后一个字符相比较,第二个字符与倒数第二个字符比较,依次类推,第 i 个字符与第 n-i个字符比较.如果每次比较都相等,则为回文,如果某次比较不相等,就不是回文.因此,可以把字符序列分别入队列和栈,然后逐个出队列和出栈并比较出队列的字符和出栈的字符是否相等,若全部相等则该字符序列就是回

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

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

数据结构-王道2017-第3章 栈和队列-栈和队列的应用

1.前中后缀表达式的转换: 举例说明将自然表达式转换成二叉树: a×(b+c)-d ① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树 ②然后是a×(b+c),在写时注意左右的位置关系 ③最后在右边加上 -d 然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的: ① 前序遍历:根-左-右 ② 中序遍历:左-根-右 ③ 后序遍历:左-右-根 前缀表达式:-*a+bcd 中缀表达式:a*b+c-d 后缀表达式:abc+*d- 2.队列在层次遍历二叉树中起作用,且在计算机系统中应用非

第四章 栈与队列2 (对列)

4.2 队列 4.2.1 队列的定义 队列简称队,它通栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除.在队列中把插入数据元素的一端称为队尾(rear),删除元素的一端称为队首(front).向队尾插入元素称为进队或入队.从队列中删除元素称为离队或出队. 队列是先进先出表(First In First Out,FIFO). 队列的接口Queue: 1 package com.datastructure.chapter04.interfaces; 2 3

第四章 栈与队列(a)栈接口与实现

原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/10265879.html

第04章 栈和队列

栈 队列 优先级队列 本章涉及到的三种存储数据类型:栈 队列 优先级队列 本章涉及到的存储数据类型是算法构思的辅助工具,而不仅仅是存储数据的工具.数据结构的生命周期比较短,在程序结束时,对应的数据结构的生命周期随之结束. 栈 队列 优先级队列是比较抽象的数据结构,通过接口对三种数据结构进行定义和实现,而实现的过程对用户来说是屏蔽的. 栈 (后进先出) 栈只允许访问一个数据项,即最后插入的项,当最后一项被移除时,才能对倒数第二项进行操作,依次类推. 栈的操作有两种,入栈和出栈,push  pop.

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a