《栈和队列梁》PPT课件.ppt
《《栈和队列梁》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《栈和队列梁》PPT课件.ppt(64页珍藏版)》请在三一办公上搜索。
1、第3章堆栈和队列,主讲:梁宝兰,2,教学要求,三种特殊的线性表栈、队列、优先队列掌握栈、队列、优先队列的相关概念;掌握栈、队列、优先队列的顺序存储与链式存储结构掌握栈和队列的应用,了解优先队列的应用,3,生活中的例子:羊肉串 子弹夹食堂吃饭队伍银行柜台服务,引子,它们都是操作受限的线性表,4,3.1 堆栈,一、栈的基本概念堆栈(Stack):限定仅在表的一端进行插入和删除操作的线性表。栈顶(top):表的插入和删除端。栈底(bottom):表的另一端。空栈:没有任何元素的栈。特点:先进后出,top,入栈,出栈,5,a1,a2,a3,入栈,出栈,栈底/栈顶,插入:入栈、进栈、压栈删除:出栈、弹栈
2、,栈的示意图,3.1 堆栈,6,栈的操作特性:后进先出,a1,a2,a3,入栈,出栈,插入:入栈、进栈、压栈删除:出栈、弹栈,栈的示意图,3.1 堆栈,7,例3-1:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,a,b,c,情况1:,3.1 堆栈,8,a,b,c,出栈序列:c,出栈序列:c、b,出栈序列:c、b、a,情况1:,3.1 堆栈,例3-1:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,9,a,b,出栈序列:b,情况2:,3.1 堆栈,例3-1:有三个元素按a、b、c的次序依次进栈,且每个元素只
3、允许进一次栈,则可能的出栈序列有多少种?,10,a,出栈序列:b,出栈序列:b、c,出栈序列:b、c、a,c,注意:栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。,情况2:,3.1 堆栈,例3-1:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,11,ADT StackData 栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系Operation InitStack 前置条件:栈不存在 输入:无 功能:栈的初始化 输出:无 后置条件:构造一个空栈,3.1.2 栈的抽象数据类型,12,DestroyStack
4、 前置条件:栈已存在 输入:无 功能:销毁栈 输出:无 后置条件:释放栈所占用的存储空间Push 前置条件:栈已存在 输入:元素值x 功能:在栈顶插入一个元素x 输出:如果插入不成功,抛出异常 后置条件:如果插入成功,栈顶增加了一个元素,13,Pop 前置条件:栈已存在 输入:无 功能:删除栈顶元素 输出:如果删除成功,返回被删元素值,否则,抛出异常 后置条件:如果删除成功,栈减少了一个元素GetTop 前置条件:栈已存在 输入:无 功能:读取当前的栈顶元素 输出:若栈不空,返回当前的栈顶元素值 后置条件:栈不变,14,Empty 前置条件:栈已存在 输入:无 功能:判断栈是否为空 输出:如果
5、栈为空,返回1,否则,返回0 后置条件:栈不变endADT,15,3.1.3 顺序堆栈类,顺序栈栈的顺序存储结构,如何改造数组实现栈的顺序存储?,a1,确定用数组的哪一端表示栈底。,附设指针top指示栈顶元素在数组中的位置。,16,出栈:top减1,进栈:top加1,栈空:top=0 不能出栈栈满:top=MAX_SIZE 不能进栈,a1,a2,a3,3.1.3 顺序堆栈类,17,/顺序栈类的实现const int Max=100;typedef char Data;class SeqStack private:int MaxSize;int top;Data*s;/栈动态数组指针 publi
6、c:SeqStack(int max);/构造函数 void ClearStack(void);/清空栈 void Push(const Data,3.1.3 顺序堆栈类,18,/顺序栈的实现SeqStack:SeqStack(int max)/构造函数 s=new Data max;MaxSize=max;top=0;/指向栈中最后一个元素后一个元素,3.1.3 顺序堆栈类,19,3.1.3 顺序堆栈类,/顺序栈的实现bool SeqStack IsEmpty()/判断是否空 return top=0;bool SeqStack:IsFull()/判断是否满 return top=MaxSi
7、ze;,20,3.1.3 顺序堆栈类,/顺序栈的实现Data SeqStack:GetTop()const/取栈顶元素 if(top=0)cout“栈为空”endl;exit(0);return stop-1;,21,3.1.3 顺序堆栈类,/顺序栈的实现void SeqStack:Push(const Data/top指示上一个存储单元,22,3.1.3 顺序堆栈类,/顺序栈的实现Data SeqStack:Pop(void)Data temp;if(top=0)/判断栈是否为空 cout“栈已空!endl;exit(0);top-;/调整栈顶指示器指向下一个存储单元 temp=stop;/
8、将栈顶元素保存在temp中 return temp;/返回原来栈顶元素,23,回文判断(程序示例)算法思想:将一个串s的字符依次压入栈中,然后逐步将栈中元素弹出栈,并将出栈元素放入一个新串t中。如果s和t相等,则s是一个回文串。,顺序栈应用,源程序,24,3.1.4 链式堆栈类,链栈:栈的链接存储结构,如何改造链表实现栈的链接存储?,将哪一端作为栈顶?(线性表的头还是尾?)链栈需要加头结点吗?,25,定义结点类 class StackNode friend class LinkStack;private:Data data;StackNode*next;public:StackNode()ne
9、xt=NULL;StackNode(const Data,3.1.4 链式堆栈类,26,定义结点类 class LinkStack private:StackNode*top;int size;public:LinkStack();/构造函数 LinkStack();/析构函数 void Push(const Data,3.1.4 链式堆栈类,27,3.1.4 链式堆栈类,/链式堆栈类实现LinkStack:LinkStack()/构造函数 top=new StackNode();/创建头结点bool LinkStack:IsEmpty()if(top-next=NULL)return 1;e
10、lse return 0;,28,/析构函数LinkStack:LinkStack()StackNode*p,*q;p=top;while(p!=NULL)q=p;p=p-next;delete q;,3.1.4 链式堆栈类,29,/压栈操作:在链栈的头结点后面插入一个结点void LinkStack:Push(const Data,3.1.4 链式堆栈类,30,/出栈操作:删除链栈头结点后面的一个结点Data LinkStack:Pop()Data x;StackNode*p=top-next;if(p=NULL)coutnext=p-next;x=p-data;delete p;retur
11、n x;,3.1.4 链式堆栈类,31,*思考题,假设采用不带头结点的单链表实现栈,有关栈的操作如何调整?(包括构造函数、压栈、出栈、判空等操作),你认为这种做法好吗?,32,数制转换/把一个长整型数num转换为一个r进制数输出,3.2 堆栈应用,实现算法思想:把num不断地除以r取余数,并把余数压栈,然后取商除以r取余,并把余数压栈;直到商为0;把栈中的数弹栈输出。,数制转换思想:把num不断地除以r取余数,然后取商除以r取余,直到商为0;把余数出现的次序,从后到先进行排列,即为相应的r进制数,源程序,33,string DecToBin(int n)SeqStack stk;string
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 栈和队列梁 队列 PPT 课件
链接地址:https://www.31ppt.com/p-5532551.html