ch3--栈-队列-数组.ppt





《ch3--栈-队列-数组.ppt》由会员分享,可在线阅读,更多相关《ch3--栈-队列-数组.ppt(114页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构数据结构Data StructureData Structure 张先宜 13909696718 第3章 栈 队列 数组n3.1 栈栈n3.2 队列队列n3.3 数组数组n3.4 栈的应用栈的应用栈和递归栈和递归 n栈栈和和队列队列也是线性表,是也是线性表,是操作受限操作受限的特殊的线性的特殊的线性表。线性表的插入、删除操作是不受限制的;而表。线性表的插入、删除操作是不受限制的;而栈的插入、删除操作只能在表的同一端进行;队栈的插入、删除操作只能在表的同一端进行;队列的插入操作在表的一端进行,删除操作在表的列的插入操作在表的一端进行,删除操作在表的另一端进行。另一端进行。n但从但从数据类
2、型数据类型角度看,它们是和线性表不相同的角度看,它们是和线性表不相同的两种重要的数据结构。在计算机科学和程序设计两种重要的数据结构。在计算机科学和程序设计中有广范的应用。中有广范的应用。3.1 栈n栈(栈(Stack)栈是一种基本的、重要的、应用广泛的数据)栈是一种基本的、重要的、应用广泛的数据结构。结构。n栈是按栈是按“先进后出先进后出”操作方式组织的数据结构。操作方式组织的数据结构。n日常生活中栈操作方式实例:日常生活中栈操作方式实例:F洗碗摞一堆;书摞成一堆;一些枪支子弹夹中子弹的操作方洗碗摞一堆;书摞成一堆;一些枪支子弹夹中子弹的操作方式等。式等。n计算机中栈的应用实例:计算机中栈的应
3、用实例:F许多类型许多类型CPU的内部就构建了栈;的内部就构建了栈;F在操作系统、编译器、虚拟机等系统软件中栈都有重要的应在操作系统、编译器、虚拟机等系统软件中栈都有重要的应用,比如,函数调用、语法检查等。用,比如,函数调用、语法检查等。F在应用软件设计和实际问题求解中更是经常会用到栈结构,在应用软件设计和实际问题求解中更是经常会用到栈结构,比如,表达式求解、回溯法求解问题、递归实现、递归算法比如,表达式求解、回溯法求解问题、递归实现、递归算法转换为非递归、树和图搜索的非递归实现等。转换为非递归、树和图搜索的非递归实现等。3.1.1 栈的基本概念n栈(栈(Stack)F是限定只能在一端插入和删
4、除元素的线性表。是限定只能在一端插入和删除元素的线性表。n栈顶(栈顶(top)F进行插入和删除操作的一端成为栈顶。进行插入和删除操作的一端成为栈顶。n栈底(栈底(bottom)F另一端成为栈底。另一端成为栈底。n入栈(入栈(push)F栈的插入操作叫入栈(压栈)。栈的插入操作叫入栈(压栈)。n出栈(出栈(pop),),F栈的删除操作叫出栈(弹栈)。栈的删除操作叫出栈(弹栈)。a1a2anana2a1a1 a2 an an an-1 a1入栈(PUSH)出栈(POP)栈顶(top)栈底(bottom)n栈的特性栈的特性F后进先出后进先出(LIFO-Last In First Out),或,或F先
5、进后出先进后出(FILO-First In Last Out)n栈是栈是操作受限操作受限的线性表。的线性表。3.1.2 栈的基本运算n栈的基本运算与线性表的基本运算类似,但又有栈的基本运算与线性表的基本运算类似,但又有其特殊之处。其特殊之处。n(1)初始化栈:初始化栈:initialStack(S)F设置栈设置栈S S为空栈。为空栈。n(2)判断栈是否为空:判断栈是否为空:stackEmpty(S)F若栈若栈S S为空,返回为空,返回TRUETRUE,否则,返回,否则,返回FALSEFALSE。n(3)取栈顶元素值:取栈顶元素值:stackTop(S,x)F若栈若栈S S不空,将栈不空,将栈S
6、 S的栈顶元素的值送变量的栈顶元素的值送变量x x中,否中,否则应返回出错信息。则应返回出错信息。n(4)判断栈是否为满:判断栈是否为满:stackFull(S)F栈栈S为满时,返回为满时,返回TRUE,否则,返回,否则,返回FALSE。n(5)入栈:入栈:pushStack(S,x)F将值为将值为x的元素插入到栈的元素插入到栈S中。若插入前的栈已经中。若插入前的栈已经满了,不能入栈时,应报出错信息。满了,不能入栈时,应报出错信息。n(6)出栈:出栈:popStack(S)F若栈若栈S不空,删除栈不空,删除栈S的栈顶元素,否则应返回出的栈顶元素,否则应返回出错信息。错信息。3.1.3 顺序栈n
7、1.顺序栈存储结构顺序栈存储结构 采用顺序表来存储的栈采用顺序表来存储的栈#define MaxLen 100 /最大容量最大容量typedef struct elementType dataMaxLen;/存放栈元素存放栈元素 int top;/指示栈顶元素的位置指示栈顶元素的位置 seqStack;ana4a3a2a10 1 2 3 n-1 MaxLen-1 datatopseqStackn2.顺序栈上运算的实现顺序栈上运算的实现n(1)初始化初始化:void initStack(seqStack*S)S-top=-1;ana4a3a2a10 1 2 3 n-1 MaxLen-1 data
8、topseqStackn(2)判栈空判栈空:BOOL stackEmpty(seqStack S)if(S.top=-1)return true;else return false;F以上代码可以用一条语句:以上代码可以用一条语句:return(S.top=-1);ana4a3a2a10 1 2 3 n-1 MaxLen-1 datatopseqStackn(3)判栈满判栈满:BOOL stackFull(seqStack S)if(S.top=MaxLen-1)return TRUE;/栈满,返回栈满,返回true else return FALSE;/栈不满,返回栈不满,返回falsean
9、a4a3a2a10 1 2 3 n-1 MaxLen-1 datatopseqStackn(4)读栈顶元素读栈顶元素:void stackTop(seqStack*S,elementType&x)if(S-top=-1)error(“栈空栈空”);else x=S-dataS-top;/参数参数x返回栈顶元素返回栈顶元素ana4a3a2a10 1 2 3 n-1 MaxLen-1 datatopseqStackn(5)入栈入栈:void pushStack(seqStack*S,elementType x)if(S-top=MaxLen-1)error(“栈满栈满”);else S-top+;
10、/栈顶后移栈顶后移 S-data S-top=x;/元素元素x入栈入栈 n(6)出栈出栈:void popStack(seqStack*S,elementType&x)if (stackEmpty(*S)error(“栈空栈空,不能删除不能删除”);else x=S-dataS-top;/取栈顶元素至取栈顶元素至x S-top-;/栈顶减栈顶减1,即删除了栈顶元素,即删除了栈顶元素 /可用一行代码:可用一行代码:x=S-dataS-top-;n3.顺序栈特点顺序栈特点F所有运算的时间复杂度均为所有运算的时间复杂度均为O(1);F通常一次性申请空间,只能按最大空间需求分配,通常一次性申请空间,只
11、能按最大空间需求分配,容易造成空间浪费。容易造成空间浪费。-使用链式栈。使用链式栈。F本教材使用数组实现简单易理解,也可以使用本教材使用数组实现简单易理解,也可以使用malloc()或或new申请一块连续的空间实现,但处理和操作申请一块连续的空间实现,但处理和操作较复杂。较复杂。3.1.4 链栈n链栈即采用链式存储结构实现的的栈。链栈即采用链式存储结构实现的的栈。n链栈可用单链表结构来表示。结点结构同单链表。链栈可用单链表结构来表示。结点结构同单链表。n链栈既可以带头结点,也可以不带头结点。链栈既可以带头结点,也可以不带头结点。n在这种表示中,同样要注意栈顶位置的选择。在这种表示中,同样要注意
12、栈顶位置的选择。F不带头结点,栈顶指针不带头结点,栈顶指针top指示有元素结点;指示有元素结点;F带有节点,栈顶指针带有节点,栈顶指针top-next指示首元素结点;指示首元素结点;F事实上,这里的栈顶指针事实上,这里的栈顶指针top即单链表的头指针即单链表的头指针(只是叫法不同)。(只是叫法不同)。data数据元素数据元素next直接后继的地址直接后继的地址数据域数据域指针域指针域n链栈既可以带头结点,也可以不带头结点。链栈既可以带头结点,也可以不带头结点。a1a2an an-1toptop不带头结点的非空链栈不带头结点的非空链栈栈顶指针栈顶指针栈底栈底栈顶结点栈顶结点toptopa1a2a
13、n 头结点头结点带头结点的带头结点的非空链栈非空链栈toptop 头结点头结点带头结点的带头结点的空链栈空链栈栈顶指针栈顶指针栈顶结点栈顶结点栈底栈底栈顶指针栈顶指针n链栈的结点存储同单链表链栈的结点存储同单链表typedef struct lsNodeelementType data;/链栈结点数据域链栈结点数据域struct lsNode*next;/链栈结点指针域链栈结点指针域 sNode,*linkedStack;n不带头结点链栈的基本运算不带头结点链栈的基本运算(1)初始化栈初始化栈F由于不带头结点,初始化仅需将栈顶指针置为空。由于不带头结点,初始化仅需将栈顶指针置为空。【算法描述算
14、法描述】void initialStack(sNode*&top)top=NULL;(2)入栈入栈【算法描述算法描述】void pushStack(sNode*&top,elementType x)sNode*s;s=new sNode;/申请新结点申请新结点s-data=x;/装入元素值装入元素值s-next=top;/新结点链接到栈新结点链接到栈top=s;/更新栈顶指针,使指向新结点更新栈顶指针,使指向新结点(3)出栈出栈bool popStack(sNode*&top,elementType&x)sNode*u;if(top=NULL)return false;/栈空,返回栈空,返回f
15、alse else x=top-data;/取栈顶元素,由变量取栈顶元素,由变量x返回返回 u=top;/栈顶指针保存到栈顶指针保存到u top=top-next;/栈顶指针后移一个元素结点栈顶指针后移一个元素结点 delete u;/释放原栈顶结点释放原栈顶结点 return true;/出栈成功,返回出栈成功,返回truen不带头结点链栈的其他基本运算请您自行完成。不带头结点链栈的其他基本运算请您自行完成。n带头结点的链栈的初始化、插入、删除操作同带带头结点的链栈的初始化、插入、删除操作同带头结点的单链表。头结点的单链表。n带头结点链栈的基本运算请您自行完成。带头结点链栈的基本运算请您自行
16、完成。n栈的链式存储结构(链式栈)特点:栈的链式存储结构(链式栈)特点:F使用连续或不连续的存储空间;使用连续或不连续的存储空间;F各数据元素独立存储,依靠指针链接建立逻辑相邻各数据元素独立存储,依靠指针链接建立逻辑相邻关系;关系;F 对每个数据元素单独申请结点空间;对每个数据元素单独申请结点空间;F 由于动态申请空间,没有栈满溢出问题;由于动态申请空间,没有栈满溢出问题;F 栈顶指针栈顶指针 top 唯一确定一个链式栈;唯一确定一个链式栈;F 链式栈也可以加同构头结点,这种情况下:链式栈也可以加同构头结点,这种情况下:Top-next 指向栈顶元素;指向栈顶元素;若若 top-next 为为
17、 NULL,则为一空栈。,则为一空栈。F 如果同时需要如果同时需要2个以上栈,最好使用链式栈。个以上栈,最好使用链式栈。3.1.5 栈的应用实例1.栈的基本应用实例栈的基本应用实例【例例3.1】输入输入n个整数,逆序输出。个整数,逆序输出。【分析分析】利用栈结构的利用栈结构的FILO特性,输入时采用循环特性,输入时采用循环入栈,输出采用循环出栈。入栈,输出采用循环出栈。【实现代码实现代码】ex31readWrite.cppcoutn;cout请输入数据元素请输入数据元素:endl;for(int i=1;ix;pushStack(S,x);cout逆序输出:逆序输出:;/逆序输出逆序输出whi
18、le(!stackEmpty(S)/n个整数循环出栈个整数循环出栈stackTop(S,x);/取栈顶元素取栈顶元素coutxnext;/L移动指向为逆置的下一结点移动指向为逆置的下一结点ai+1u-next=P;/ai结点的结点的next指向指向p,形成逆置,形成逆置P=u;/p移动指向移动指向ai,P和和u皆指向已逆置的第一结点皆指向已逆置的第一结点L=P;/原表头指向新的表头原表头指向新的表头【解法二解法二】基于栈技术求解。基于栈技术求解。F定义一个顺序栈,栈元素为单链表的结点指针,循定义一个顺序栈,栈元素为单链表的结点指针,循环取出每个结点的指针,入栈。入栈后,原链表尾环取出每个结点的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ch3 队列 数组

限制150内