第三章 堆栈和队列
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从输入和输出数据元素的位置关系看, 从输入和输出数据元素的位置关系看 , 堆栈的功能 和一种火车调度装置的功能类同。 和一种火车调度装置的功能类同。
3.1.2 堆栈抽象数据类型 1数据集合 堆栈的数据集合可以表示为a 堆栈的数据集合可以表示为 0,a1,…,an-1,每个数据元 素的数据类型可以是任意的类类型。 素的数据类型可以是任意的类类型。 2操作集合 插入堆栈。 (1)入栈 )入栈push(obj):把数据元素 插入堆栈。 ):把数据元素obj插入堆栈 (2)出栈 )出栈pop():出栈 删除的数据元素由函数返回。 :出栈, 删除的数据元素由函数返回。 (3)取栈顶数据元素 )取栈顶数据元素getTop():取堆栈当前栈顶的数 : 据元素并由函数返回。 据元素并由函数返回。 (4)非空否 )非空否notEmpty():若堆栈非空则函数返回 :若堆栈非空则函数返回true, , 否则函数返回false。 否则函数返回 。
栈顶 栈顶 栈底
b a
特殊线性表——栈 特殊线性表 栈
栈的逻辑结构
的次序依次进栈, 例:有三个元素按a、b、c的次序依次进栈,且每个 有三个元素按 、 、 的次序依次进栈 元素只允许进一次栈,则可能的出栈序列有多少种? 元素只允许进一次栈,则可能的出栈序列有多少种? 情况2: 情况 : 出栈序列: 出栈序列:b
第3章 堆栈和队列 章
3.1 堆栈 3.2 堆栈的应用 3.3 队列 3.4 优先级队列
从数据结构角度看,栈和队列是操作受 从数据结构角度看,栈和队列是操作受 的线性表,他们的逻辑结构相同。 限的线性表,他们的逻辑结构相同。
本章主要知识点: 本章主要知识点:
● 堆栈的基本概念,堆栈的用途 堆栈的基本概念, ● 顺序堆栈类的设计方法,链式堆栈类的设计方法 顺序堆栈类的设计方法, ● 队列的基本概念,队列的用途 队列的基本概念, ● 顺序循环队列的基本实现原理,顺序循环队列的队空 顺序循环队列的基本实现原理, 和队满判断方法, 和队满判断方法,顺序循环队列类的设计方法 ● 链式堆栈类的设计方法 ● 优先级队列的概念,优先级队列的用途,顺序优先级 优先级队列的概念,优先级队列的用途, 队列的入队列和出队列操作设计方法
栈顶 栈顶 栈底
c a
出栈序列: 、 出栈序列:b、c 出栈序列: 、 、 出栈序列: b、 c、a
注意: 注意:栈只是对表插入和删除操作的位置进行了限 并没有限定插入和删除操作进行的时间。 制,并没有限定插入和删除操作进行的时间。
栈的逻辑结构
的次序依次进栈, 例3-1:有三个元素按 、b、c的次序依次进栈,且每 :有三个元素按a、 、 的次序依次进栈 个元素只允许进一次栈,则可能的出栈序列有多少种? 个元素只允许进一次栈,则可能的出栈序列有多少种? 输出序列有5种,分别为:abc、acb、bac、bca、cba 输出序列有 种 分别为: 、 、 、 、 不可能的输出序列为: 不可能的输出序列为: cab
栈的链接存储பைடு நூலகம்构及实现
链栈: 链栈:栈的链接存储结构 head head a n
栈顶
a1 an-1
a2 a1 ∧
栈底
ai top an an-1
an ∧
栈顶
两种示意图在内存中 对应同一种状态 a1 ∧ 栈底
2 链式堆栈类的设计 public class LinStack implements Stack{ Node head; int size; public void LinStack(){ head = null; size = 0; } public void push(Object obj){ head = new Node(obj, head); size ++; }
栈顶 栈顶 栈顶 栈底
c b a
特殊线性表——栈 特殊线性表 栈
栈的逻辑结构
的次序依次进栈, 例:有三个元素按a、b、c的次序依次进栈,且每个 有三个元素按 、 、 的次序依次进栈 元素只允许进一次栈,则可能的出栈序列有多少种? 元素只允许进一次栈,则可能的出栈序列有多少种? 情况1: 情况 :
栈顶 栈顶 栈顶 栈底
出栈序列: 出栈序列:c
c b a
出栈序列: 、 出栈序列:c、b 出栈序列: 、 、 出栈序列:c、b、a
特殊线性表——栈 特殊线性表 栈
栈的逻辑结构
的次序依次进栈, 例:有三个元素按a、b、c的次序依次进栈,且每个 有三个元素按 、 、 的次序依次进栈 元素只允许进一次栈,则可能的出栈序列有多少种? 元素只允许进一次栈,则可能的出栈序列有多少种? 情况2: 情况 : 出栈序列: 出栈序列:b
public Object pop() throws Exception{ if(size == 0){ throw new Exception("堆栈已空!"); } Object obj = head.element; head = head.next; size --; return obj; } public boolean notEmpty(){ return head != null; } public Object getTop(){ return head.element; } }
插入:入栈、进栈、 插入:入栈、进栈、压栈 删除:出栈、 删除:出栈、弹栈
栈的操作特性: 栈的操作特性:后进先出
特殊线性表——栈 特殊线性表 栈
栈的逻辑结构
的次序依次进栈, 例:有三个元素按a、b、c的次序依次进栈,且每个 有三个元素按 、 、 的次序依次进栈 元素只允许进一次栈,则可能的出栈序列有多少种? 元素只允许进一次栈,则可能的出栈序列有多少种? 情况1: 情况 :
3.1.4 链式堆栈 链式存储结构的堆栈称作链式堆栈。 链式存储结构的堆栈称作链式堆栈。 链式堆栈 1 链式堆栈的存储结构 和单链表相同, 和单链表相同 , 链式堆栈也是由一个个结点组成 每个结点由两个域组成, 的 , 每个结点由两个域组成 , 一个是存放数据元素的 数据元素域element,另一个是存放指向下一个结点的 , 数据元素域 对象引用(即指针) 对象引用(即指针)域next。 。 堆栈有两端, 堆栈有两端 , 插入数据元素和删除数据元素的一 端为栈顶,另一端为栈底。 端为栈顶 , 另一端为栈底 。 链式堆栈都设计成把靠近 堆栈头head的一端定义为栈顶。 的一端定义为栈顶。 堆栈头 的一端定义为栈顶
a1 a2 a3
top top top 进栈: 加 进栈:top加1 出栈: 减 出栈:top减1 栈空: 栈空:top= 0 栈满: 栈满:top= MAX_SIZE
2 顺序堆栈类的实现
public class SeqStack implements Stack{ final int defaultSize = 10; int top; Object[] stack; int maxStackSize; public SeqStack(){ initiate(defaultSize); } public SeqStack(int sz){ initiate(sz); } private void initiate(int sz){ maxStackSize = sz; top = 0; stack = new Object[sz]; }
3.1 堆栈
3.1.1 堆栈的基本概念 堆栈(也简称作栈)是一种特殊的线性表, 堆栈(也简称作栈)是一种特殊的线性表,堆栈的 数据元素以及数据元素间的逻辑关系和线性表完全相同, 数据元素以及数据元素间的逻辑关系和线性表完全相同, 其差别是线性表允许在任意位置进行插入和删除操作, 其差别是线性表允许在任意位置进行插入和删除操作,而 堆栈只允许在固定一端进行插入和删除操作。 堆栈只允许在固定一端进行插入和删除操作。 空栈: 空栈:不含任何数据元素的栈 堆栈中允许进行插入和删除操作的一端称为栈顶, 堆栈中允许进行插入和删除操作的一端称为栈顶, 栈顶 另一端称为栈底 堆栈的插入操作通常称为进栈或入栈, 栈底。 另一端称为栈底。堆栈的插入操作通常称为进栈或入栈, 堆栈的删除操作通常称为出栈或退栈。 堆栈的删除操作通常称为出栈或退栈
public void push(Object obj) throws Exception{ if(top == maxStackSize){ throw new Exception("堆栈已满!"); } stack[top] = obj; top ++; } public Object pop() throws Exception{ if(top == 0){ throw new Exception("堆栈已空!"); } top --; return stack[top]; }
public Object getTop() throws Exception{ if(top == 0){ throw new Exception("堆栈已空!"); } return stack[top - 1]; } public boolean notEmpty(){ return (top > 0); } }
System.out.print("出栈元素序列为:"); while(myStack.notEmpty()) System.out.print(myStack.pop()+" "); } catch(Exception e){ System.out.println(e.getMessage()); } } } 程序运行输出结果如下: 当前栈顶元素为:9 出栈元素序列为:9 7 5 3 1
3.1.3 顺序堆栈 1 顺序堆栈的存储结构 顺序存储结构的堆栈称作顺序堆栈。 顺序存储结构的堆栈称作顺序堆栈。 顺序堆栈 顺序堆栈的存储结构示意图如图所示。 顺序堆栈的存储结构示意图如图所示。
a 0 a 1 a 2 a 3 a4
1 顺序堆栈的存储结构 如何改造数组实现栈的顺序存储? 如何改造数组实现栈的顺序存储?
……, (a1, a2, …… an)
栈底 栈顶
特殊线性表——栈 特殊线性表 栈
栈的示意图
入栈 栈顶 栈顶 栈顶 栈底 出栈
a3 a2 a1
插入:入栈、进栈、 插入:入栈、进栈、压栈 删除:出栈、 删除:出栈、弹栈
特殊线性表——栈 特殊线性表 栈
栈的示意图
入栈 栈顶 栈顶 出栈
栈底
a3 a2 a1
3.1.2 堆栈抽象数据类型 堆栈抽象数据类型的Java接口定义如下: 接口定义如下: 堆栈抽象数据类型的 接口定义如下 public interface Stack{ public void push(Object obj) throws Exception; public Object pop() throws Exception; public Object getTop() throws Exception; public boolean notEmpty(); }
0 1 2 3 4 5 6 7 8
a1
top top 确定用数组的哪一端表示栈底。 确定用数组的哪一端表示栈底。 附设指针top指示栈顶元素在数组中的下一个位置。 附设指针 指示栈顶元素在数组中的下一个位置。 指示栈顶元素在数组中的下一个位置
1 顺序堆栈的存储结构
0 1 2 3 4 5 6 7 8
如何改造链表实现栈的链接存储? 如何改造链表实现栈的链接存储? head a1 a2 ai an ∧
将哪一端作为栈顶? 将哪一端作为栈顶? 将链头作为栈顶,方便操作。 将链头作为栈顶,方便操作。 链栈需要加头结点吗? 链栈需要加头结点吗? 链栈不需要附设头结点。 链栈不需要附设头结点。
特殊线性表——栈 特殊线性表 栈
3 顺序堆栈类的测试
public class SeqStackTest{ public static void main(String[] args){ SeqStack myStack = new SeqStack(); int test[] = {1, 3, 5, 7, 9}; int n=5; try{ for(int i = 0; i < n; i ++) myStack.push(new Integer(test[i])); System.out.println("当前栈顶元素为:" + myStack.getTop());