数据结构与算法项目化教程ppt模块2 栈-歌曲播放器.pptx
《数据结构与算法项目化教程ppt模块2 栈-歌曲播放器.pptx》由会员分享,可在线阅读,更多相关《数据结构与算法项目化教程ppt模块2 栈-歌曲播放器.pptx(62页珍藏版)》请在汇文网上搜索。
1、项 目 描 述相 关 知 识项 目 实 施项 目 总 结C O N T A N T S目录 项目描述某公司的播放器软件程序的研发工作。播放器的其中一个功能是:从播放列表中顺序播放歌曲。设计一个程序,模拟播放器的播放顺序功能。项目描述introduction具体系统功能需求如下:(1)可在待播放歌曲列表添加歌曲。(2)当前点击播放的歌曲因为是最想听的,应先播放,即后加入歌曲列表的歌曲先播放。(3)待播放列表设定最大长度作为任务1,不设定最大长度作为任务2。(4)输入错误提示:最大长度设定值只能为数字,如输入字符,系统自动将其设置为默认值20。项目描述introduction本项目利用栈结构存储待
2、播歌曲。“添加歌曲”功能对应入栈操作,新加的歌曲放在栈顶(待播歌曲栏的最上方),“播放歌曲”功能对应出栈操作,即从栈顶取出最后放入的歌曲,添加到已播歌曲列表。项目描述图2-1 播放器示意图图2-2 播放器程序界面 相关知识栈的定义 栈的基本运算 顺序栈 链栈Useful knowleage相关知识栈的定义栈的基本运算顺序栈链栈栈是一种特殊的线性表,它仅允许在表的一端进行运算。在表中,允许插入和删除的一端称为“栈顶”,另一端称为“栈底”,将元素插入栈顶的操作成为“进栈”,称删除栈顶元素的操作为“出栈”,如图2-3所示。因为出栈操作时后进栈的元素先出,所以栈也被称为是一种“后进先出”表,简称为LI
3、FO(Last In First Out)。1栈的定义图2-3 堆栈根据实际应用,通常认为,栈应该包含了以下一些基本运算:(1)栈初始化置栈为空栈。(2)判断栈是否为空若栈为空,则返回true,否则返回false。(3)求栈的长度返回栈的元素个数。(4)进栈将一个元素下推进栈。(5)出栈将栈顶元素托出栈。(6)读栈顶返回栈顶元素。2栈的基本运算抽象数据类型(abstract data type,ADT)是带有一组操作的一些对象的集合,在ADT的定义中只定义了一些基本的操作,没有提到关于这组操作是如何实现的任何解释。在Java中,我们用栈的接口IStack表示栈这些功能操作的集合。在后面的例子中
4、,我们将实现这个接口,通过展示不同的实现代码,详细解释顺序栈和链栈的不同之处。但不管怎样,只要这些类实现了栈的接口,你就可以将其成为栈。2栈的基本运算栈的接口代码如下:public interface IStack public void push(Object obj)throws Exception;/进栈public Object pop()throws Exception;/出栈 public Object getTop()throws Exception;/取栈顶public boolean isEmpty();/判断栈是否为空public int getSize();/求栈长2栈的
5、基本运算与线性表类似,栈的存储结构也分为顺序存储结构和链式存储结构。顺序存储结构的栈简称为顺序栈,链式存储结构的栈称为链栈。1)顺序存储定义2)顺序栈的基本运算3)顺序栈的动手实践3顺序栈1)顺序存储定义与顺序线性表类似,顺序栈也需要通过一个一维数组存储元素,同时设置栈顶元素的位置下标,如图2-4所示。顺序栈=一维数组+栈顶指示图2-4 顺序栈的存储结构顺序栈用一个类SeqStack 实现,其数据类型描述如下:public class SeqStack implements IStack final int defaultSize=10;int maxSize;int top;/栈顶指示Obj
6、ect stack;/一维数组顺序栈用一维数组stack存放数据,序号为i的元素a_i对应数组的下标是i-1,即用stacki-1表示,栈顶用stacktop表示。栈空及栈满条件:栈空条件:top=-1。栈满条件:top=MaxSize-1。2)栈的基本运算 Useful knowleage判断栈是否为空2求栈的长度3进栈操作4出栈操作5获取栈顶元素6栈初始化1打印栈中所有元素72)栈的基本运算 出栈操作栈是否为空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素栈的初始化实现比较简单,通过添加一个initiate方法,在该方法中将栈顶top的值设置为-1即可,同时创建一个用于存储栈中元素的一维
7、数组stack,参数sz表示栈的大小。然后在构造函数中调用此方法。public class SeqStack implements IStack final int defaultSize=10;int maxSize;int top;/栈顶指示Object stack;/一维数组 public SeqStack()initiate(defaultSize);public SeqStack(int sz)initiate(sz);private void initiate(int sz)maxSize=sz;top=-1;stack=new Objectsz;2)栈的基本运算 出栈操作栈是否为
8、空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素此处实现接口中的isEmpty方法。在判断栈是否为空时,只需将栈顶指示top值与-1相比即可,若top值为-1,则表示顺序栈中不包含任何元素,代码如下。public boolean isEmpty()return top=-1;2)栈的基本运算 出栈操作栈是否为空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素此处实现接口中的getSize方法。栈的长度即为栈中数组的元素个数,因为top值总是指向最后一个元素,考虑到当top值为0时,已经有一个元素存在,则元素的个数为top+1,代码如下。public int getSize()return t
9、op+1;2)栈的基本运算 出栈操作栈是否为空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素此处实现接口中的push方法。假设顺序栈中包含元素(a1,a2,a3),将元素e入栈时,实际就是要在栈顶位置插入该元素。相关过程如图2-5所示,具体步骤为:(1)栈顶指示top朝栈的增长方向前进一步(即top值增1)。(2)将元素放入栈中由当前栈顶top指向的位置上。在栈的这种静态实现中,进行进栈运算时,必须先进行栈满检查,以避免错误。图2-5 将元素入栈2)栈的基本运算 出栈操作栈是否为空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素 public void push(Object obj)thr
10、ows Exception if(top=maxSize-1)throw new Exception(栈满无法进栈!);else top+;stacktop=obj;2)栈的基本运算 出栈操作栈是否为空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素 此处实现接口中的pop方法。同样假设顺序栈中包含元素(a1,a2,a3),现将a3元素出栈,只需将栈顶指示top后退一步(即top值减1)即可,如图所示。同时若需在出栈的同时返回该出栈元素,还需通过一个临时变量获取a3并返回。应该注意的是,出栈前应进行栈空检查。public Object pop()throws Exception if(top=
11、-1)return null;else Object e=stacktop;top-;return(e);2)栈的基本运算 出栈操作栈是否为空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素 此处实现接口中的getTop方法。根据栈顶指示top,可以直接获取最后入栈的元素。应该注意的是,在进行读取之前,也要进行栈空检查,代码如下:public Object getTop()throws Exception if(top=-1)return null;return stacktop;2)栈的基本运算 出栈操作栈是否为空栈的长度进栈操作栈初始化栈顶元素打印栈中所有元素 此方法非接口中定义的功能,但
12、可以在SeqStack类中进行扩展,代码如下:public void print()for(int i=0;i=top;i+)System.out.print(stacki+);System.out.println();public static void main(String args)throws Exception/创建一个栈SeqStack ss=new SeqStack();/判断是否为空System.out.println(是否为空:+ss.isEmpty();/进栈操作,1-10依次进栈for(int i=0;i10;i+)ss.push(i+1);/打印栈中元素ss.prin
13、t();/显示栈顶元素System.out.println(当前栈顶元素为+ss.getTop();/出栈5次,并显示每一次的出栈元素for(int i=0;i5;i+)System.out.println(出栈元素为+ss.pop();/显示栈长System.out.println(当前栈长为+ss.getSize();测试端代码图2-7 堆栈程序运行结果3)顺序栈的动手实践12345实现思路实训内容关键代码运行结果实训目的掌握顺序栈的进栈、出栈等操作,学会较为复杂问题的求解。3)顺序栈的动手实践12345实现思路实训内容关键代码运行结果实训目的给定一个只包括(,),的字符串 s,判断字符串
14、是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例1示例2示例3示例4示例5输入:s=()输出:true输入:s=()输出:true输入:s=(输出:false输入:s=()输出:false输入:s=输出:true3)顺序栈的动手实践12345实现思路实训内容关键代码运行结果实训目的如果计算出左括号的数量,和右括号的数量,如果每种括号左右数量相同,会不会就是有效的括号了呢?事实上不是的,假如输入是,每种括号的左右数量分别相等,但不是有效的括号。这是因为结果还与括号的位置有关。仔细分析我们发现,对于有效的括号,它的部分子表达式仍然是有效的括号,比如()
15、()是一个有效的括号,()是有效的括号,()也是有效的括号。并且当我们每次删除一个最小的括号对时,我们会逐渐将括号删除完。这个思考的过程其实就是栈的实现过程。因此我们考虑使用栈,当遇到匹配的最小括号对时,我们将这对括号从栈中删除(即出栈),如果最后栈为空,那么它是有效的括号,反之不是。3)顺序栈的动手实践12345实现思路实训内容关键代码运行结果实训目的括号匹配栈的原理图3)顺序栈的动手实践12345实现思路实训内容关键代码运行结果实训目的请读者理解代码并填空,运行得到相应结果。public static boolean isValid(String s)throws Exception Se
16、qStack stk=new SeqStack(s.length();for(char c:s.toCharArray()/如果c是(则入栈if(c=(|c=|c=)/如果c是)并且栈不为空 则判断栈顶是否为与之对应的左括号。是则出栈,不是则返回fasleelse if(c=)&!stk.isEmpty()&(char)stk.getTop()=()else if(c=&!stk.isEmpty()&(char)stk.getTop()=)else if(c=&!stk.isEmpty()&(char)stk.getTop()=)else/如果c是)栈为空 那么返回false/如果c是)栈不为
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载共享资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法项目化教程ppt模块2 栈-歌曲播放器 数据结构 算法 项目 教程 ppt 模块 歌曲 播放