栈与队列(java版).ppt
《栈与队列(java版).ppt》由会员分享,可在线阅读,更多相关《栈与队列(java版).ppt(115页珍藏版)》请在三一办公上搜索。
1、第三章 栈与队列,教学内容,3.2 队列,3.1 栈,3.4 栈与队列的综合应用举例,3.3 栈与队列的比较,教学重点与难点,重点:,栈、队列的特点;栈、队列基本操作的实现算法,难点:,栈、队列的应用,通常称,栈和队列是限定插入和删除只能在表的“端点”进行的线性表。,线性表 栈 队列 Insert(i,x)Insert(n,x)Insert(n,x)0in Delete(i)Delete(n-1)Delete(0)0in-1,栈和队列是两种操作受限的线性表,是两种常用的数据类型。,3.1.1 栈的概念,(1)栈是仅限制在表尾进行插入和删除操作的特 殊线性表,限制操作的表尾端称为“栈顶”,另一
2、端称为“栈底”,(2)栈是“后进先出”的线性表(LIFO)或“先 进后出”的线性表(FILO),3.1.1 栈的概念,如下图所示的是铁路调度站形象地表示栈的“后进先出”特点。,3.1.1 栈的概念,思考题:,设有编号为1,2,3,4的四辆列车,顺序进一个栈式结构的站台,具体写出这四辆列车开出车站的所有可能的顺序。,3.1.1 栈的概念,解答:,四辆车出站的所有可能顺序为:,6)2、1、3、4;7)2、1、4、3;8)2、3、4、1;9)2、3、1、4;10)2、4、3、1;,14)4、3、2、1。,1)1、2、3、4;2)1、2、4、3;3)1、3、2、4;4)1、3、4、2;5)1、4、3、
3、2;,11)3、2、1、4;12)3、2、4、1;13)3、4、2、1;,3.1.2 栈的抽象数据类型描述,clear(),1)栈的置空操作:,isEmpty(),2)栈的判空操作:,length(),3)求栈的长度:,4)取栈顶元素操作:,5)入栈操作:,peek(),push(x),6)出栈操作:,pop(),1.基本操作,3.1.2 栈的抽象数据类型描述,2.栈的抽象数据类型的Java接口描述,public interface IStack,public void clear();public boolean isEmpty();public int length();public Ob
4、ject peek();public void push(Object x)throws Exception;public Object pop();,实现此接口的方法有两种:,顺序栈,链栈,3.1.3 顺序栈及其基本操作的实现,1.顺序栈,非空栈,空栈,3.1.3 顺序栈及其基本操作的实现,1.顺序栈,思考,栈空条件?,栈满条件?,栈的长度?,栈顶元素?,如下问题如何描述?,top=0,top=stackElem.length,top,stackElemtop-1,3.1.3 顺序栈及其基本操作的实现,2.顺序栈类的描述(书P71-与P33顺序表类对照学习),public class SqS
5、tack implements IStack private Object stackElem;private int top;,/构造一个容量为maxSize的空栈 public SqStack(int maxSize),/栈置空 public void clear(),stackElem=new ObjectmaxSize;,top=0;,top=0;,2.顺序栈类的描述(见教材P71),public class SqStack implements IStack,/栈判空public boolean isEmpty(),/求栈数据元素个数函数 public int length(),/取
6、栈顶元素的函数 public Object peek(),return top=0;,return top;,if(!isEmpty()/栈非空return stackElemtop-1;/栈顶元素 elsereturn null;,2.顺序栈类的描述(见教材P71),public class SqStack implements IStack,/入栈操作的函数public void push(Object x),/出栈操作的函数public void pop(),/输出函数(从栈顶到栈底)public void display(),for(int i=top-1;i=0;i-),System
7、.out.print(stackElemi.toString()+);,3.顺序栈基本操作的实现,1)顺序栈的入栈操作 push(x)的实现(算法 3.1),(1)操作要求:插入元素x使其成为顺序栈中新的栈顶元素。,x,a.判断顺序栈是否为满,若满则抛出异常 b.若栈不满,则将新元素x 压入栈顶,并修正栈顶指针,(2)算法步骤:,if(top=stackElem.length)throw new Exception(栈已满),1)顺序栈的入栈操作 push(x)的实现(算法 3.1),(3)算法,public void push(Object x)throws Exception/算法3.1结
8、束,if(top=stackElem.length)throw new Exception(栈已满);else stackElemtop+=x;,1)顺序栈的入栈操作 push(x)的实现(算法 3.1),时间复杂度为:O(1),3.顺序栈基本操作的实现,2)顺序栈的出栈操作 pop()的实现(算法 3.2),(1)操作要求:将栈顶元素从栈中移去,并返回被移去的栈顶元素值。,a0,a1,an-1,an-2,(2)算法步骤:,2)顺序栈的出栈操作 pop()的实现(算法 3.2),a)若栈空,则返回空值,b)若栈不空,则移去栈顶元素并返回其值,if(top=0)return null;,a1,a
9、2,an,an-1,或 if(isEmpty()return null;,return stackElemtop;,return stackElem-top;,top=top-1;,(3)算法,public Object pop()throws Exception/算法3.2结束,if(isEmpty()return null;elsereturn stackElem-top;,2)顺序栈的出栈操作 pop()的实现(算法 3.2),时间复杂度为:O(1),3.1.4 链栈及其基本操作的实现,1.链栈,栈的链式存储结构称为链栈,是运算受限的单链表,其插入和删除操作仅限制在链表的表头位置上进行,
10、故链栈没有必要象单链表一样附加头结点,栈顶指针即为链表的头指针。,3.1.4 链栈及其基本操作的实现,1.链栈,思考,栈空条件?,栈的长度?,栈顶元素?,如下问题如何描述?,top=null,需从栈顶开始沿着next指针依次对结点逐个进行点数才能确定。,top.getData(),3.1.4 链栈及其基本操作的实现,2.链栈类的描述(书中P73-74),Import cho2.Node;public class LinkStack implements IStack private Node top;,/栈置空函数 public void clear(),/判空函数public boolean
11、 isEmpty(),top=null;,return top=null;,2.链栈类的描述(书中P73-74),public class LinkStack implements IStack,/求栈数据元素个数函数 public int length(),/取栈顶元素的函数 public Object peek(),if(!isEmpty()/栈非空 return top.getData();/栈顶元素else return null;,2.链栈类的描述(书中P73-74),public class LinkStack implements IStack,/入栈操作的函数public vo
12、id push(Object x),/出栈操作的函数public void pop(),/输出函数(从栈顶到栈底)public void display(),Node p=top;,System.out.print(p.getData().tostring()+),p=p.getNext();,while(p!=null),0,3.链栈基本操作的实现,1)求链栈的长度操作 length()的实现,(1)操作要求:计算出链栈中所包含的数据元素的个数并返回其值。,(2)方法 与求单链表长度的方法相同。,length,1,2,3,4,5,6,(3)算法,public int length()/算法3
13、.3结束,Node p=top;int length=0;,时间复杂度为:O(n),1)求链栈的长度操作 length()的实现(算法 3.3),while(p!=null)p=p.getNext();+length;,3.链栈基本操作的实现,2)链栈的入栈操作 push(x)的实现(算法 3.4),(1)操作要求:将数据域值为x的新结点插入到链栈的栈顶,使其成为新的栈顶元素。,top,Node p=new Node(x);,p.setNext(top);,top=p;,(2)算法,public void push(object x)/算法3.4结束,Node p=new Node(x);,2
14、)链栈的入栈操作 push(x)的实现(算法 3.4),时间复杂度为:O(1),p.setNext(top);,top=p;,3.链栈基本操作的实现,3)链栈的出栈操作 pop()的实现(算法 3.5),(1)操作要求:将首结点(或栈顶结点)从链栈中移去,并返回该结点的数据域的值。,Node p=top;,top=top.getNext(),return(p.getData();,top,(2)算法,public Object pop()/算法3.5结束,3)链栈的出栈操作 pop()的实现(算法 3.5),时间复杂度为:O(1),Node p=top;,top=top.getNext(),r
15、eturn(p.getData();,if(isEmpty()return null;else,3.1.5 栈的应用,例1.分隔符匹配问题,例2.大数加法问题,例3.表达式求值问题,例4.栈与递归问题,【例1】分隔符匹配问题-问题分析,假设在表达式中()或(/*/)等为正确的格式,()或())或()均为不正确的格式。,则 检验分隔符是否匹配的方法可用“期待的急迫程度”这个概念来描述。,Java程序中分隔符有圆、方、花括号和注释符“/*”和“*/”。,分析可能出现的不匹配的情况:,到来的右分隔符并非是所“期待”的;,例如:考虑下列括号序列:()或())或()1 2 3 4 1 2 3 4 5 6
16、 1 2 3 4 5,到来的是“不速之客”;,直到结束,也没有到来所“期待”的括弧。,【例1】分隔符匹配问题-问题分析,【例1】分隔符匹配问题-问题分析,这三种情况对应到栈的操作即为:1和栈顶的左分隔符不相匹配;2栈中并没有左分隔符等在那里;3栈中还有左分隔符没有等到和它相匹配的右括弧。,算法的设计思想:,1)凡出现左括弧,则进栈;,2)凡出现右括弧,首先检查栈是否空 若栈空,则表明该“右括弧”多余,否则和栈顶元素比较,若相匹配,则“左括弧出栈”,否则表明不匹配。,3)表达式检验结束时,若栈空,则表明表达式中匹配正确,否则表明“左括弧”有余。,【例1】分隔符匹配问题-问题分析,【例1】分隔符匹
17、配问题-程序代码(P77-78),public class Example3_1,private final int LEFT=0;/记录左分隔符private final int RIGHT=1;/记录右分隔符private final int OTHER=2;/记录其他字符,Import;,public int verifyFlag(String str)if(.equals(str)|.equals(str)|.equals(str)|/*.equals(str)/左分隔符 return LEFT;else if().equals(str)|.equals(str)|.equals(st
18、r)|*/.equals(str)/右分隔符 return RIGHT;else/其它的字符 return OTHER;,public class Example3_1,/检验左分隔符str1和右分隔符str2是否匹配public boolean matches(String str1,String str2)if(.equals(str1),【例1】分隔符匹配问题-程序代码(P77-78),public class Example3_1,/检验串中分隔符是否匹配private boolean isLegal(String str)throws Exception,if(!.equals(st
19、r)if(i!=length)if(/=c&*=str.charAt(i+1)|(*=c&/=str.charAt(i+1),t=t.concat(String.valueOf(str.charAt(i+1);+i;/跳过一个字符,【例1】分隔符匹配问题-程序代码(P77-78),public class Example3_1,/检验串中分隔符是否匹配private boolean isLegal(String str)throws Exception,if(LEFT=verifyFlag(t)S.push(t);/压栈else if(RIGHT=verifyFlag(t)if(S.isEmp
20、ty()|!matches(S.pop().toString(),t)throw new Exception(错误:Java语句不合法!);,if(!S.isEmpty)throw new Exception(错误:Java语句不合法!);/抛出异常return true;,else throw new Exception(错误:Java语句为空!);/抛出异常,【例1】分隔符匹配问题-程序代码(P77-78),public class Example3_1,/主函数public static void main(String args)throws Exception,Example3_1
21、e=new Example3_1();(请输入分Java语句:);Scanner sc=new Scanner(System.in);if(e.isLegal(sc.nextLine()System.out.println(Java语句合法!);else(“错误:Java语句不合法!);,【例1】分隔符匹配问题-程序代码(P77-78),【例2】大数加法问题问题分析,何谓大数:,所谓大数是指超过整数最大上限的数,处理方法,将两个加数看成是数字字符串,将这些数的相应数字存储在两个堆栈中,并从两个栈中弹出对应位的数字依次执行加法却可得到结果。,【例2】大数加法问题操作步骤,2.若两个加数栈都非空,
22、则依次从栈中弹出栈顶数字相加,和存入变量partialSum中;若和有进位,则将和的个位数压入结果栈sum中,并将进位数加到下一位数字相加的和中;若和没有进位,则直接将和压入结果栈sum中;,1.将两个加数的相应位从高位到低位依次压入栈sA和sB中。,4.若两个加数栈都为空,则栈sum中保存的就是计算结果。注意栈顶是结果中的最高位数字。,【例2】大数加法问题操作步骤,3.若某个加数堆栈为空,则将非空加数栈中的栈顶数字依次弹出与进位相加,和的个位数压入结果栈sum中,直到此该栈为空为止。若最高位有进位,则最后将1压入栈sum中。,【例2】大数加法问题-(书P79图3.10),【例2】大数加法问题
23、程序代码,Example3_2.java,(书P79-80),【例3】表达式求值问题分析,限于二元运算符的表达式定义:表达式:=(操作数)+(运算符)+(操作数)操作数:=简单变量|表达式 简单变量:=标识符|无符号整数,【例3】表达式求值问题分析,在计算机中,表达式的3种标识方法:,设 Exp=S1+OP+S2,则称 OP+S1+S2 为前缀表示法,S1+OP+S2 为中缀表示法,S1+S2+OP 为后缀表示法,【例3】表达式求值问题分析,例如:Exp=a b+(c d/e)f前缀式:+a b c/d e f中缀式:a b+c d/e f后缀式:a b c d e/f+,结论:,1)操作数之
24、间的相对次序不变;,2)运算符的相对次序不同;,3)中缀式丢失了括弧信息,致使运算的次序不确定;,4)前缀式的运算规则为:连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最小表达式;,5)后缀式的运算规则为:运算符在式中出现的顺序恰为 达式的运算顺序;每个运算符和在它之前出现 且紧靠它的两个操作数构成一个最小表达式。,【例3】表达式求值问题分析,每个运算符的运算次序要由它之后的一个运算符来定;在后缀式中,优先数高的运算符领先于优先数低的运算符。,分析:“原表达式”和“后缀式”中的 运算符:原表达式:a+b c d/e f 后缀式:a b c+d e/f,1.如何从原表达式求得后缀式?
25、,【例3】表达式求值问题分析,为此我们先引进一个运算符的“优先级”的概念。给每个运算符赋以一个优先级的数值,如下表所示:,【例3】表达式求值问题分析,1)设立一个运算符栈;,2)若当前字符是操作数,则直接发送给后缀 式;,3)若当前字符为运算符时,若运算符 栈为空或运算符栈非空且其优先数高于栈顶运算符,则进栈;否则,退出栈顶运算符发送给后缀式;,从原表达式求得后缀式的操作步骤为:,4)若当前字符是左括号“(”时,将其压进 运算符栈;,【例3】表达式求值问题分析,5)若当前字符是右括号“)”时,反复 将 栈顶符号弹出,并送往后缀表达式,直到栈顶符号是左括号为止,再将左 括号出栈并丢弃。,6)若读
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 java
链接地址:https://www.31ppt.com/p-5773306.html