数据结构与算法第三章清华大学出版社赵玉兰.ppt
《数据结构与算法第三章清华大学出版社赵玉兰.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法第三章清华大学出版社赵玉兰.ppt(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第3章章 栈和队列栈和队列3.1 栈栈3.2 队列队列3.3 栈与队列的应用栈与队列的应用23.1 栈栈ADT栈栈栈(栈(Stack)u只允许在表的一端进行插只允许在表的一端进行插入和删除的线性表入和删除的线性表u允许插入和删除的一端称允许插入和删除的一端称为栈顶(为栈顶(top),另一端称),另一端称为栈底(为栈底(bottom)u不含元素的栈称为空栈不含元素的栈称为空栈 u插入:进栈,入栈插入:进栈,入栈 删除:出栈,退栈删除:出栈,退栈u特点特点后进先出(后进先出(LIFO)先进后出(先进后出(FILO)33.1 栈栈ADT栈栈问题问题u有三个元素按有三个元素按 a1,a2,a3 的次
2、序依次进栈,其出栈的次序依次进栈,其出栈次序有几种可能?次序有几种可能?出栈次序:出栈次序:a1,a2,a3 a1,a3,a2 a2,a1,a3 a2,a3,a1 a3,a2,a1注意:注意:栈只是对表插入和删除操作的位置进行了限栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。制,并没有限定插入和删除操作进行的时间。43.1 栈栈ADT栈栈栈的抽象数据类型栈的抽象数据类型ADT Stack Data 数据项列表数据项列表 top:栈顶位置:栈顶位置 Operations Constructor Process:创建一个空栈:创建一个空栈 IsEmpty Proce
3、ss:判断栈是否为空:判断栈是否为空 Output:如果栈为空,则返回:如果栈为空,则返回true,否则返回,否则返回false GetTop Process:取栈顶元素:取栈顶元素 Output:返回栈顶元素:返回栈顶元素53.1 栈栈ADT栈栈 Length Process:求栈中元素个数:求栈中元素个数 Output:返回栈中元素的个数:返回栈中元素的个数 Push Input:要添加的数据元素:要添加的数据元素 Process:向栈中添加元素:向栈中添加元素x,即进栈,即进栈 Pop Process:删除栈顶元素,即出栈:删除栈顶元素,即出栈 Output:返回栈顶元素:返回栈顶元素
4、Clear Process:删除栈中所有元素并置新的栈顶:删除栈中所有元素并置新的栈顶 /Stack63.1 栈栈栈的实现栈的实现顺序栈顺序栈顺序栈的定义顺序栈的定义如何改造数组实现栈的顺序存储?如何改造数组实现栈的顺序存储?0 1 2 3 4 5 6附设指针附设指针top指示栈顶元指示栈顶元素在数组中的位置。素在数组中的位置。top确定用数组的哪确定用数组的哪一端表示栈底。一端表示栈底。a1a2a373.1 栈栈栈的实现栈的实现顺序栈的基本操作顺序栈的基本操作出栈:先出栈出栈:先出栈 top再减再减1进栈:进栈:top先加先加1 再进栈再进栈栈空:栈空:top=-1 0 1 2 3 4 5
5、6 7 8a1topa2topa3top栈满:栈满:top=MaxStackSize-1top top83.1 栈栈栈的实现栈的实现const int MaxStackSize=50;/栈中能容纳最大元素个数栈中能容纳最大元素个数class SeqStack DataType StackListMaxStackSize;int top;public:Stack();/构造函数,初始化构造函数,初始化top bool IsEmpty();/判断栈的状态是否为空判断栈的状态是否为空 bool IsFull();DataType GetTop();/取栈顶元素取栈顶元素 void Push(cons
6、t DataType x);/入栈入栈 DataType Pop();/出栈出栈 void Clear();/栈清空栈清空;/SeqStack93.1 栈栈栈的实现栈的实现顺序栈的操作的实现顺序栈的操作的实现u构造函数,初始化一个空栈构造函数,初始化一个空栈 Stack()StackList=new DataTypeMaxStackSize;top=-1;/Stack103.1 栈栈栈的实现栈的实现u判断栈是否为空判断栈是否为空 bool IsEmpty()if(top=-1)return true;else return false;/IsEmpty113.1 栈栈栈的实现栈的实现u判断栈是
7、否已满判断栈是否已满 bool IsFull()if(top=MaxStackSize-1)return true;else return false;/IsFull123.1 栈栈栈的实现栈的实现u取栈顶元素取栈顶元素 DataType GetTop()if(IsEmpty()cout”栈空!栈空!”endl;return nulldata;return StackListtop;133.1 栈栈栈的实现栈的实现u向栈顶压入元素向栈顶压入元素 void Push(DataType x)if(IsFull()cout”栈满!栈满!”endl;else StackList+top=x;/Push
8、143.1 栈栈栈的实现栈的实现u删除栈顶元素删除栈顶元素 DataType Pop()if(IsEmpty()cout”栈空!栈空!”next=NULL;/创建头结点创建头结点 void Push(DataType data);183.1 栈栈栈的实现栈的实现 DataType Pop();DataType GetTop();void Clear()top-next=NULL;bool IsEmpty()return top-next=NULL;/LinkStack193.1 栈栈栈的实现栈的实现类中操作算法的描述类中操作算法的描述u入栈操作入栈操作 void Push(DataType i
9、tem)p=new StackNode(item);p-next=top-next;top-next=p;/Push203.1 栈栈栈的实现栈的实现u出栈操作出栈操作 DataType pop()if(top-next!=NULL)p=top-next;retvalue=p-data;/暂存栈顶数据暂存栈顶数据 top-next=p-next;/修改栈顶指针修改栈顶指针 delete p;/释放,返回数据释放,返回数据 return retvalue;else /栈空的情况栈空的情况 cout”the stack is empty!”next!=NULL)return top-next-dat
10、a;else /栈空的情况栈空的情况 cout”the stack is empty!”1时,先把塔时,先把塔 A 上的上的 n-1 个圆盘移到塔个圆盘移到塔 B,然后将,然后将 n 号盘从塔号盘从塔 A 移到塔移到塔 C,再将,再将 n-1 个圆盘从塔个圆盘从塔 B移到塔移到塔C。即把求解即把求解 n 个圆盘的个圆盘的Hanoi问题转化为求解问题转化为求解 n-1 个圆盘个圆盘的的 Hanoi 问题,依次类推,直至转化成只有一个圆盘问题,依次类推,直至转化成只有一个圆盘的的 Hanoi 问题。问题。313.1 栈栈栈与递归栈与递归323.1 栈栈栈与递归栈与递归u解决汉诺塔问题的算法解决汉诺
11、塔问题的算法 main()int n;coutn;hanoi(n,A,B,C);void hanoi(int n,char x,char y,char z)if(n=1)move(1,x,z);else hanoi(n-1,x,z,y);move(n,x,z);hanoi(n-1,y,x,z);333.1 栈栈栈与递归栈与递归递归过程和运行时栈递归过程和运行时栈递归函数的运行轨迹递归函数的运行轨迹u描述方法描述方法1)写出函数当前调用层执行的各语句,并用箭头表示语)写出函数当前调用层执行的各语句,并用箭头表示语句的执行次序;句的执行次序;2)对函数的每个递归调用,写出相应的函数调用,从调)对函
12、数的每个递归调用,写出相应的函数调用,从调用处画一条箭头指向被调用函数入口,表示调用路线,用处画一条箭头指向被调用函数入口,表示调用路线,从被调用函数末尾处画一条箭头指向调用语句的下面,从被调用函数末尾处画一条箭头指向调用语句的下面,表示返回路线;表示返回路线;3)在返回路线上标出本层调用所得的函数值。)在返回路线上标出本层调用所得的函数值。343.1 栈栈栈与递归栈与递归un=3 时汉诺塔递归算法的运行轨迹时汉诺塔递归算法的运行轨迹Hanoi(3,A,B,C)Move(A,3,C)Hanoi(2,A,C,B)Hanoi(2,A,C,B)Hanoi(3,A,B,C)Hanoi(1,A,B,C)
13、递归第三层递归第三层递归第二层递归第二层递归第一层递归第一层Move(A,1,C)Hanoi(1,C,A,B)Move(C,1,B)Hanoi(1,B,C,A)Move(B,1,A)Hanoi(1,A,B,C)Move(A,1,C)Hanoi(1,A,B,C)Move(A,2,B)Hanoi(1,C,A,B)Hanoi(2,B,A,C)Hanoi(1,B,C,A)Move(B,2,C)Hanoi(1,A,B,C)Hanoi(2,B,A,C)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)353.1 栈栈栈与递归栈与递归递归函数的内部执行过程递归函数
14、的内部执行过程u当一个函数在运行期间调用另一个函数时,在运当一个函数在运行期间调用另一个函数时,在运行被调用函数之前,系统需要将实参和返回值地行被调用函数之前,系统需要将实参和返回值地址等数据传递给被调函数,当函数调用时,这些址等数据传递给被调函数,当函数调用时,这些数据与局部变量一起构成一条数据与局部变量一起构成一条“工作记录工作记录”,被,被压入系统提供的栈(运行时栈)。压入系统提供的栈(运行时栈)。u当被调函数返回时,按照返回地址执行调用函数当被调函数返回时,按照返回地址执行调用函数中下一条指令,同时释放栈中相应的工作记录。中下一条指令,同时释放栈中相应的工作记录。363.1 栈栈栈与递
15、归栈与递归主程序主程序Call proc1rproc1proc2proc3sCall proc2tCall proc3r rs st t系统运行时栈系统运行时栈局部变量局部变量返回地址返回地址实际参数实际参数工作记录工作记录373.1 栈栈栈与递归栈与递归u递归调用的内部执行过程递归调用的内部执行过程运行开始时,首先为递归调用建立一个系统运行时栈;运行开始时,首先为递归调用建立一个系统运行时栈;每次执行递归调用之前,把递归函数的值参和局部变量每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址等组成的工作记录压入的当前值以及调用后的返回地址等组成的工作记录压入栈中;栈中
16、;每次递归调用结束后,将栈顶元素出栈,使相应的值参每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。的位置继续执行。383.1 栈栈栈与递归栈与递归un=3 时汉诺塔递归算法的部分执行过程时汉诺塔递归算法的部分执行过程 main()hanoi(3,A,B,C);void hanoi(int n,char x,char y,char z)if(n=1)move(1,x,z);else hanoi(n-1,x,z,y);move(n,x,z);hanoi(n-1,y,x,z);012345
17、6789ABC321返回返回地址地址zyxn 3ABC 01CAB82ACB61ABC612393.1 栈栈栈与递归栈与递归递归总结递归总结u递归是重要的设计和编程工具,使许多算法变得递归是重要的设计和编程工具,使许多算法变得简单,易于设计和实现。简单,易于设计和实现。优点优点u递归使算法的时间复杂度和空间复杂度同时增大,递归使算法的时间复杂度和空间复杂度同时增大,有时会导致效率急剧恶化,或者溢出系统栈。有时会导致效率急剧恶化,或者溢出系统栈。缺点缺点u使用递归时应该权衡效率和设计的关系。在有足使用递归时应该权衡效率和设计的关系。在有足够的空间并且时间要求不高的情况下可以使用递够的空间并且时间
18、要求不高的情况下可以使用递归。归。403.2 队列队列ADT定义定义定义定义u队列(队列(Queue)是只允许在表的一端进行删除,而)是只允许在表的一端进行删除,而在另一端进行插入的线性表。在另一端进行插入的线性表。允许删除的一端叫做队头(允许删除的一端叫做队头(front)允许插入的一端叫做队尾(允许插入的一端叫做队尾(rear)u特点特点先进先出(先进先出(FIFO,First In First Out)a1 a2 a3.an 入队入队出队出队frontrear413.2 队列队列ADT定义定义ADT队列的定义队列的定义ADT Queue Data 数据项列表数据项列表 front:队列中
19、第一个元素的位置:队列中第一个元素的位置 rear:队列中最后一个元素的位置:队列中最后一个元素的位置 Operations Constructor Process:初始化队首和队尾:初始化队首和队尾 IsEmpty Process:判断是否为空队列:判断是否为空队列 Output:若队列空,返回:若队列空,返回true,否则返回,否则返回false423.2 队列队列ADT定义定义 Length Process:求队列中元素个数:求队列中元素个数 Output:返回队列的元素个数:返回队列的元素个数 Front Process:取出队头元素:取出队头元素 Output:返回队头元素:返回队头
20、元素 Enter Input:要进入队列的元素:要进入队列的元素 Process:在队尾插入新的元素:在队尾插入新的元素 Leave Process:删除队头元素:删除队头元素 Output:返回队头元素:返回队头元素 ClearQueue Process:删除队列中所有元素并设置初始状态:删除队列中所有元素并设置初始状态/Queue433.2 队列队列队列的实现队列的实现顺序队列顺序队列顺序队列的定义顺序队列的定义const int MaxQSize=50;class SeqQueue int front,rear;DataType QueueListMaxQSize;public:SeqQ
21、ueue();/构造函数构造函数,初始化数据成员初始化数据成员 void Enter(DataType item);DataType Leave();void Clear();DataType Front();int Length();bool IsEmpty();bool IsFull();/SeqQueue443.2 队列队列队列的实现队列的实现顺序队列的进队和出队顺序队列的进队和出队 u设两个指针设两个指针 front 和和 rear(初始(初始 frontrear0)ufront 指向队头元素,出队时先取出,再指向队头元素,出队时先取出,再 front+1urear 指向队尾元素的下一
22、个位置,进队时先将新元素加入,指向队尾元素的下一个位置,进队时先将新元素加入,再再 rear+1u队空条件:队空条件:front=rear,此时不能出队,此时不能出队u队满条件:队满条件:rear=MaxQSize,此时不能进队,此时不能进队453.2 队列队列队列的实现队列的实现u存在问题存在问题 rear=MaxQSize时,再有元素进队发时,再有元素进队发生溢出生溢出l当当front=0真溢出真溢出l当当front 0假溢出假溢出u解决假溢出的方案解决假溢出的方案固定队头,出队时,剩余元素均向前固定队头,出队时,剩余元素均向前移动移动固定队尾,入队时,剩余元素均向前固定队尾,入队时,剩余
23、元素均向前移动移动循环队列:把队列设想成环形,让循环队列:把队列设想成环形,让 0 接在接在 MaxQSize-1 后后更好更好463.2 队列队列队列的实现队列的实现循环队列循环队列u也是队列的顺序存储结构也是队列的顺序存储结构u实现实现利用利用“模模”运算运算入队入队lQueueListrear=item;rear=(rear+1)%MaxQSize;出队出队litem=QueueListfront;front=(front+1)%MaxQSize;01frontrear.MaxQSize-1473.2 队列队列队列的实现队列的实现u仍然存在问题仍然存在问题如何判断队列是如何判断队列是“空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 第三 清华大学出版社 玉兰
限制150内