数据结构ppt课件C++版=.ppt
《数据结构ppt课件C++版=.ppt》由会员分享,可在线阅读,更多相关《数据结构ppt课件C++版=.ppt(93页珍藏版)》请在三一办公上搜索。
1、2022/12/26,mayan,第三章 栈和队列,栈栈的应用队列队列的应用优先级队列,定义:,栈,限定只能在表的一端进行插入和删除运算的线性表。,递归函数的实现 在递归函数的执行中, 需多次自己调用自己,递归函数是如何执行的?先看一般函数的调用机制如何实现的。,A( )B( );,C( ),B( )C( );,函数调用顺序 A B C,函数返回顺序 C B A,后调用的函数先返回,函数调用机制可通过栈来实现,计算机正是利用栈来实现函数的调用和返回的,n=3 阶乘函数fact(n)的执行过程,Main( ) int n=3,y;L y= fact(n);,L 3,L1 1,L1 2,1,n*f
2、act (n-1),n*fact (n-1),fact(n),返回地址 实参,递归调用中 栈的变化,将十进制整数转换成二至九之间的任一进制数输出,将一个十进制数4327转换成八进制数(10347)8:,Y,X,Z,2022/12/26,mayan,第三章 栈和队列 -栈的定义,栈和队列称为运算受限的线性表。栈(stack)是指只允许在表的末端进行插入和删除的线性表。栈又叫做后进先出(LIFO)的线性表。,栈的基本概念,栈是一种“特殊”的线性表,这种线性表上的插入和删除运算限定在表的某一端进行。栈顶:允许进行插入和删除的这一端。栈底:反之为栈底。栈顶元素:处于栈顶位置的数据元素称为。栈顶元素的位
3、置由栈顶指针变量记录;空栈:当栈中不含任何数据元素时称为,2022/12/26,mayan,第三章 栈和队列 -顺序栈,基于数组的存储表示实现的栈称为顺序栈。当前栈顶位置由数组下标指针top指示,即top指示最后加入的元素的存储位置,当top=-1时栈空,当top=maxSize-1时栈满。顺序栈的类定义,2022/12/26,mayan,第三章 栈和队列 -顺序栈的类定义,template class SeqStack /顺序栈类定义private: T *elements;/栈元素存放数组 int top;/栈顶指针 int maxSize; /栈最大容量public: SeqStack(
4、int sz =50);/构造函数 SeqStack() delete elements; /析构函数,2022/12/26,mayan,第三章 栈和队列 -顺序栈的类定义,void Push(const T,2022/12/26,mayan,第三章 栈和队列 -顺序栈的函数实现,/顺序栈的构造函数template SeqStack:SeqStack(int sz):top(-1),maxSize(sz) elements=new TmaxSize;,2022/12/26,mayan,第三章 栈和队列 -顺序栈的函数实现,/若栈不满, 则将元素x插入该栈栈顶, 否则溢出处理template v
5、oid SeqStack:Push(const T /栈顶指针先加1, 再进栈,2022/12/26,mayan,第三章 栈和队列 -顺序栈的函数实现,/函数退出栈顶元素并返回栈顶元素的值template bool SeqStack:Pop(T /退栈成功,2022/12/26,mayan,第三章 栈和队列 -顺序栈的函数实现,/若栈不空则函数返回该栈栈顶元素template bool Seqstack:getTop(T,2022/12/26,mayan,第三章 栈和队列 -双栈共享一个栈空间,为了既能减少由于栈满而引起的溢出,又能有效的利用存储空间,提出一种双栈共享一个栈空间的策略。,202
6、2/12/26,mayan,第三章 栈和队列 -双栈共享一个栈空间,两个栈共享一个数组空间VmaxSize设立栈顶指针数组t2和栈底指针数组b2ti和bi分别指示第i个栈的栈顶与栈底初始 t0 = b0 = -1, t1 = b1 = maxSize 满条件:t0+1 = t1 /栈顶指针相遇栈空条件:t0 = b0或t1 = b1 /退到栈底,2022/12/26,mayan,第三章 栈和队列 -双栈共享一个栈空间,/双栈的插入算法bool push(DualStack,2022/12/26,mayan,第三章 栈和队列 -双栈共享一个栈空间,/双栈的删除算法bool Pop(DualSta
7、ck,2022/12/26,mayan,第三章 栈和队列 -链式栈,链式栈是栈的链接存储表示。链式栈的栈顶在链表的表头。因此,新结点的插入和栈顶结点的删除都在链表的表头,即栈顶进行。,2022/12/26,mayan,第三章 栈和队列 -链式栈的类定义,template class LinkedStack : public Stack /链式栈类定义 private: LinkNode *top;/栈顶指针public: LinkedStack() : top(NULL) /构造函数,2022/12/26,mayan,第三章 栈和队列 -链式栈的类定义,LinkedStack() makeEm
8、pty(); /析构函数 void Push(const T,2022/12/26,mayan,第三章 栈和队列 -链式栈的函数实现,/逐次删去链式栈中的元素直至栈顶指针为空。template LinkedStack:makeEmpty() LinkNode *p;while (top != NULL)/逐个结点释放 p = top; top = top-link; delete p; ,2022/12/26,mayan,第三章 栈和队列 -链式栈的函数实现,/将元素值x插入到链式栈的栈顶,即链头。template void LinkedStack:Push(const T/创建失败退出,20
9、22/12/26,mayan,第三章 栈和队列 -链式栈的函数实现,/删除栈顶结点, 返回被删栈顶元素的值。template bool LinkedStack:Pop(T,2022/12/26,mayan,第三章 栈和队列 -链式栈的函数实现,/返回栈顶元素的值template bool LinkedStack:getTop(T,2022/12/26,mayan,第三章 栈和队列 -链式栈的函数实现,/返回栈中元素个数template int LinkedStack:getSize const LinkNode *p=top; int k=0; while(top!=NULL)top=top-
10、link; k+; return k;,2022/12/26,mayan,第三章 栈和队列 -链式栈的函数实现,/输出栈中元素template ostream,2022/12/26,mayan,第三章 栈和队列,例1:一个栈的入栈序列是a、b、c、d、e,则栈的不可能的输出序列是(C)。Aedcba Bdecba Cdceab Dabcde例2:对于一个栈,给出输入项a、b、c。如果输入序列由a、b、c组成,试给出全部可能的输出序列。abc acb bac bca cba,2022/12/26,mayan,第三章 栈和队列 -栈的应用之括号匹配,观察:每个右括号将与最近遇到的那个未匹配的左括号
11、相匹配。(a (b+c)-d) (a+b) )(,(,(,(,没有与右括号匹配的左括号,没有与左括号匹配的右括号,(,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,一个表达式由操作数(亦称运算对象)、操作符(亦称运算符)和分界符组成。算术表达式有三种表示:中缀(infix)表示 ,如 A+B;前缀(prefix)表示 ,如 +AB;后缀(postfix)表示 ,如 AB+;,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,表达式示例中缀表达式 A+B*(C-D)-E/F后缀表达式 ABCD-*+EF/-前缀表达式 -+A*B-CD/EF
12、表达式中相邻两个操作符的计算次序为:优先级高的先计算;优先级相同的自左向右计算;当使用括号时从最内层括号开始计算。,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,应用后缀表示计算表达式的值说明:这里只考虑双目运算的情形。从左向右顺序地扫描表达式,并用一个栈暂存扫描到的操作数或计算结果。在后缀表达式的计算顺序中已隐含了加括号的优先次序,括号在后缀表达式中不出现。计算例 A B C D + E F /,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,通过后缀表示计算表达式值的过程:顺序扫描表达式的每一项,如果该项是操作数,则将其入栈;如果该
13、项是操作符,则连续从栈中退出两个操作数X和Y,形成运算指令XY,并将计算结果重新压入栈中。当表达式的所有项都扫描并处理完后,栈顶存放的就是最后的计算结果。,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,A B C D + E F /,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,A B C D + E F /,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,中缀表示转后缀表示先对中缀表达式按运算优先次序加上括号;再把操作符后移到右括号的后面并以就近移动为原则;最后将所有括号消去。例:中缀表示(A+B)*D-
14、E/(F+A*D)+C,转换为后缀表示,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,中缀表示转前缀表示先对中缀表达式按运算优先次序通统加上括号再把操作符前移到左括号前并以就近移动为原则最后将所有括号消去。 例:中缀表示 (A+B)*D-E/(F+A*D)+C,转换为前缀表示,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,利用栈将中缀表示转换为后缀表示使用栈可将表达式的中缀表示转换成它的前缀表示和后缀表示。操作符优先级为了实现这种转换,需要考虑各操作符的优先级。,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求
15、值,各个算术操作符的优先级isp叫做栈内(in stack priority)优先数icp叫做栈外(in coming priority)优先数。操作符优先数相等的情况只出现在括号配对或栈底的“#”号与输入流最后的“#”号配对时。,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,中缀表达式转换为后缀表达式的算法操作符栈初始化,将结束符#进栈。然后读入中缀表达式字符流的首字符ch。重复执行以下步骤,直到ch = #,同时栈顶的操作符也是#,停止循环。若ch是操作数直接输出,读入下一个字符ch。若ch是操作符,判断ch的优先级icp和位于栈顶的操作符op的优先级isp:
16、,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,若 icp(ch) isp(op),令ch进栈,读入下一个字符ch。若 icp(ch) isp(op),退栈并输出。若 icp(ch) = isp(op),退栈但不输出,若退出的是“(”号读入下一个字符ch。算法结束,输出序列即为所需的后缀表达式。,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,例:给定中缀表达式A+B*(C-D)-E/F,按上述算法转换为后缀表达式。,2022/12/26,mayan,第三章 栈和队列 -栈的应用之表达式求值,A+B*(C-D)-E/F,2022/12/
17、26,mayan,第三章 栈和队列 -栈的应用之表达式求值,A+B*(C-D)-E/F,2022/12/26,mayan,第三章 栈和队列 -栈的应用之栈与递归,递归的定义 若一个对象部分地包含它自己,或用它自己给自己定义, 则称这个对象是递归的;若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。以下三种情况常常用到递归方法。 定义是递归的 数据结构是递归的 问题的解法是递归的,2022/12/26,mayan,第三章 栈和队列 -栈的应用之栈与递归,定义是递归的例如:求解阶乘函数的递归算法long Factorial(long n) if (n = 0) return 1; el
18、se return n*Factorial(n-1);,分解过程,求值过程,2022/12/26,mayan,第三章 栈和队列 -栈的应用之栈与递归,数据结构是递归的例如,单链表结构一个结点,它的指针域为NULL,是一个单链表;一个结点,它的指针域指向单链表,仍是一个单链表。,2022/12/26,mayan,第三章 栈和队列 -栈的应用之栈与递归,搜索链表最后一个结点并打印其数值template void Print(ListNode *f) if (f -link = NULL) cout data link);,2022/12/26,mayan,第三章 栈和队列 -栈的应用之栈与递归,问
19、题的解法是递归的例如汉诺塔(Tower of Hanoi)问题问题描述:有A,B,C三个塔座,A上套有n个直径不同的圆盘,按直径从小到大叠放,形如宝塔,编号1,2,3n。要求将n个圆盘从A移到C,叠放顺序不变,移动过程中遵循下列原则:每次只能移一个圆盘圆盘可在三个塔座上任意移动任何时刻,每个塔座上不能将大盘压到小盘上,2022/12/26,mayan,第三章 栈和队列 -栈的应用之栈与递归,解决方法:如果 n = 1,则将这一个盘子直接从 A 柱移到 C 柱上。否则,执行以下三步:用 C 柱做过渡,将 A 柱上的 (n-1) 个盘子移到 B 柱上:将 A 柱上最后一个盘子直接移到 C 柱上;用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 ppt 课件 C+
链接地址:https://www.31ppt.com/p-1924650.html