`

数据结构系列教程(三)

 
阅读更多
第三讲 堆栈和队列
堆栈和队列都是特殊的线性表,他们的逻辑关系完全相同,差别是线性表的插入和删除操作不受限制,而堆栈只能在栈顶插入和删除,队列只能在队尾插入、队头删除,堆栈和队列都可以分别用顺序储存结构和链式存储结构,堆栈的操作主要有入栈、出栈、取栈顶元素、是否为空,可以设计通用接口Stack..ava如下:
/**
* @author 张钰
*
*/
public interface Stack {
public void push(Object obj) throws Exception;//把数据元素obj插入堆栈
public Object pop()throws Exception;//出栈,删除栈顶元素并返回
public Object getTop()throws Exception;//获取栈顶元素
public boolean notEmpty();//判断是否为空
}
下面就不同的结构展开:
(一)顺序堆栈
具有顺序储存结构的堆栈称为顺序堆栈,顺序堆栈和顺序表的数据成员是相同的,只是顺序堆栈的入栈和出栈操作只能在当前栈顶进行,其结构可以参考下图:
栈底 栈顶
a0
a1
a2
a3
a4
satck top=5 maxStackSize-1
stack表示顺序堆栈储存数据的数组,a0、a1等表示已经入栈的数据,a0比a1先入栈,maxStackSize表示顺序堆栈数组stack的最大元素个数,top表示顺序堆栈的stack的当前栈顶的下标,设计顺序堆栈类如下SeqStack.java:
/**
* @author 张钰
*
*/
public class SeqStack implements Stack {
/*
* @see Stack#push(java.lang.Object)
*/
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[maxStackSize];
}
public void push(Object obj) throws Exception {
// 插入堆栈
if(top==maxStackSize){
throw new Exception("堆栈已满!");
}
stack[top]=obj;
top++;
}
/*
* @see Stack#pop()
*/
public Object pop() throws Exception {
// 出栈
if(top==0){
throw new Exception("堆栈已空!");
}
top--;
return stack[top];
}
/*
* @see Stack#getTop()
*/
public Object getTop() throws Exception {
// 获取栈顶数据
if(top==0){
throw new Exception("堆栈已空!");
}
return stack[top-1];
}
/*
* @see Stack#notEmpty()
*/
public boolean notEmpty() {
// 判断是否为空
return (top>0);
}
}
(二) 链式堆栈
链式堆栈具有链式存储结构,用节点构造链,,每个节点由两个域组成,一个是存放数据元素的域element,另一个是存放下一个节点的对象引用域也就是指针域next,堆栈有两端,插入数据和删除元素的一端为栈顶,另一端为栈底,链式堆栈都不带头节点(大家可以思考一下为什么?),链式堆栈类的设计LinStack.java:
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);//新节点为栈顶
}
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; //取栈顶元素
}
}
,堆栈由于其操作的特殊性而存在,在很多地方能起到独特的作用,比喻中缀表达式转换成后缀表达式,编译软件中的括号匹配问题(eclipse中就很好)都是使用堆栈的特殊性来设计算法,具体的问题大家可以和我一起交流!
下面讲讲队列,队列的特点就是从队尾插入、队头删除,也是一种特殊的线性表,队列的操作和堆栈一样主要有:入队列、出队列、取队头数据元素、是否为空,队列的接口类Queue.java可以设计如下:
/**
* @author 张钰
*
*/
public interface Queue{
public void append(Object obj) throws Exception;
public Object delete()throws Exception;
public Object getFront() throws Exception;
public Boolean notEmpty();
}
(三)顺序队列
具有顺序结构的队列就叫顺序队列,顺序队列存在假溢出问题,就是一个队列最大存储为6个元素,现在有a0 a1 a2 a3 a4 a5六个元素入队列了,然后又有a0 a1 a2三个元素出队列了,这样剩下的三个元素占据的还是队列的后三个位置,这时候要是有新的元素入队列就会出现数组越界,而事实上队列没有满,这就是假溢出问题,出现问题的原因就是队尾rear和队头front的值不能由所定义数组下界值自动转化成上界值而产生的,解决的办法就是把顺序队列所使用的储存空间构造成一个逻辑上首尾相连的循环队列,当队尾rear和队头front达到maxSize-1后,再自加1自动到0,这样就不会出现队列数组头部已空但队尾因数组下标越界而引起的溢出的假溢出问题,解决顺序循环队列的队列满和队列空状态判断问题通常三种方法:
1.少用一个储存空间,以队尾rear加1等于队头front为队列满的判断条件,即此时队列满的判断条件为:(rear+1)%maxSize=front,队列空的条件为:rear=front;
2.设置一个标志位,添加一个标志位,设标志位为tag,初始时置tag=0,每当入队列操作成功时就置tag=1,出队列操作成功时标志tag=0,那么此时队列满的判断条件是:
rear= =front && tag= =1,队列空的判断条件是:rear==front && tag= =0;
3.设置一个计数器,添加一个计数器count,初始count=0,每当入队列操作成功时count加1,每当出队列操作成功count减1,这样计数器不仅有标示功能还有计数功能,此时判断队列满的条件是:count>0 && rear= =front,队列空的条件是:count= =0;
上面三种方法很明显最好的是第三种使用计数器的方法,采用这种计数器的办法可以设计顺序循环队列的类SeqQueue.java如下:
public class SeqQueue implements Queue{
static final int defaultSize=10;
int front;
int rear;
int count;
int maxSize;
Object[] data;
public SeqQueue(){
initiate(defaultSize);
}
public SeqQueue(int sz){
initiate(sz);
}
public void initiate(int sz){
maxSize=sz;
front=rear=0;
count=0;
data=new Object[sz];
}
public void append(Object obj) throws Exception{
if(count>0 && front= =rear){
throw new Exception(“队列已满!”);
}
data[rear]=obj;
rear=(rear+1)%maxSize;
count++
}
public Object delelte() throws Exception{
if(count= =0){
throw new Exception(“队列已空!”);
}
Object temp=data[front];
front=(front+1)%maxSize;
count- -
return temp;
}
public Object getFront() throws Exception{
if(count= =0){
throw new Exception(“队列已空”);
}
return data[front];
}
public Boolean notEmpty(){
return count!=0;
}
}
以上就是顺序队列的java表示,大家可以自己做些例子测试一下,队列还有一种就是链式队列,链式队列就是具有链式结构的队列,链式队列通常设计成不带头节点的结构,结合以前的链式表可以很容易设计出链式队列的类,这个任务就留给大家了,如果有什么疑问的话可以到我们的论坛咨询(http://www.easyjf.com/bbs),队列就是一种从队尾进入队头删除的特殊的顺序表,设计时还考虑了一种优先级队列,就是给队列中的每个元素添加一个优先级标示,出队列时按优先级从高到低的顺序进行,这就是优先级队列,在系统进程管理中的应用很广泛,这个优先级队列这里不做过多的阐述,有兴趣的同学可以研究研究,也可以和我一起探讨!下一讲:串!
分享到:
评论

相关推荐

    数据结构的一些教程不是很全

    《数据结构系列教程三》可能讨论了图数据结构和哈希表。图由节点和边构成,可以表示复杂的关系网络,如社交网络或路线图。图的遍历算法,如深度优先搜索(DFS)和广度优先搜索(BFS),在解决许多实际问题时非常有用...

    数据结构案例教程

    此外,压缩包中的“书目”和“前言”文件可能提供了教程的参考文献和作者对教程的概述,而“丛书序”可能是该系列教程的介绍,对于了解教程的背景和目的非常有帮助。 学习这个教程,不仅可以深化对数据结构的理解,...

    数据结构教程--北京航空航天唐发根版

    唐发根教授是北京航空航天大学的一位知名计算机科学家,他的数据结构教程因其深入浅出的讲解而广受学生和专业人士的欢迎。 在唐发根版的数据结构教程中,我们可以期待学习到以下关键知识点: 1. **数组**:基础...

    李春葆数据结构教程第三版

    李春葆的《数据结构教程》第三版是一本广泛使用的教材,旨在帮助初学者掌握这门关键领域的基础知识。本教程涵盖了数据结构的基本概念、设计方法以及实际应用。 首先,我们要理解什么是数据结构。数据结构是组织和...

    数据结构讲解,习题。初学

    “数据结构系列教程一”、“数据结构系列教程二”和“数据结构系列教程三”可能是针对这些概念和习题的详细解释,它们可能从基础知识开始,逐步深入到高级主题,并提供实例和练习,帮助初学者掌握数据结构的核心概念...

    C#数据结构教程 C#数据结构教程

    ### C# 数据结构教程知识点概览 #### 一、引言 - **背景与动机**:随着C#作为微软.NET框架的重要组成部分,越来越多的开发者转向使用C#进行开发。因此,编写一本专注于C#的数据结构教程显得尤为重要。本书旨在填补...

    数据结构视频教程

    本视频教程专注于讲解数据结构的理论与实践,通过耿国华教授在西北大学的全147讲课程,为学习者提供深入浅出的指导。 数据结构包括多种类型,每种类型都有其特定的应用场景和优势。常见的数据结构有数组、链表、栈...

    数据结构(唐发根)

    唐发根教授的数据结构教程是一部深受初学者欢迎的教材,它全面且深入地介绍了数据结构的基本概念、算法和应用。下面我们将详细探讨其中的知识点。 1. **基本概念**:首先,你需要理解什么是数据结构。数据结构是...

    数据结构和算法系列教程

    本系列教程涵盖了数据结构和算法的核心概念,旨在帮助学习者强化软件开发的内功心法。 首先,我们从01数据结构概述.ppt开始,它会介绍数据结构的基本概念,如数组、链表、栈、队列、树和图等。数据结构是存储和组织...

    数据结构教程-第5版-李春葆-配套课件PPT

    李春葆教授的《数据结构教程》第五版是该领域的经典教材,配套的课件PPT提供了丰富的教学资源,帮助学生深入理解和掌握数据结构的基本概念、算法和应用。 一、数据结构基本概念 数据结构是指数据的存储结构,包括...

    C语言描述的数据结构与算法教程

    本教程旨在帮助初学者理解数据结构和算法,并通过C语言进行实践。同时,教程还涉及到机器学习的基本算法,使学习者能将所学应用于更高级的技术领域。 一、数据结构 数据结构是组织和管理数据的方式,它决定了数据的...

    数据结构教程-源程序

    本教程“数据结构教程-源程序”是基于清华大学出版、严蔚敏教授编著的经典教材,提供了一系列实际的源代码,帮助学习者深入理解数据结构的概念和实现。 在数据结构的学习中,你会接触到以下几个关键知识点: 1. *...

    C语言数据结构——教程

    《C语言数据结构——教程》 C语言是计算机科学领域中的基础编程语言,以其高效、灵活和可移植性而闻名。在深入学习C语言的过程中,数据结构是不可或缺的一部分,它是理解算法和程序设计的关键。本教程将围绕C语言的...

    数据结构案例教程(C语言版)

    《数据结构案例教程(C语言版)》系统地介绍了各种常用的数据结构,内容丰富,概念讲解清楚,叙述严谨流畅,逻辑性强。书中配备了大量的案例,每个案例都经过精心设计,既能帮助读者理解知识,又具有启发性。 《数据...

    数据结构之教程

    ### 数据结构之教程知识点概述 #### 一、数据结构的基本概念和术语 - **数据**:数据是指客观事物的符号表示。例如,在学生学习成绩表中,“92分”是某个学生的C语言成绩这一客观事实的符号表示。 - **数据元素**...

    数据结构教程c语言版

    - **链表**:链表是一种动态数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。 - **单链表**:单链表中的每个节点只包含一个指向其后继节点的指针。 - **双链表**:双链表中的每个节点包含...

    数据结构教程实验答案

    数据结构是计算机科学与技术中极其重要的一门课程,它不仅涉及理论知识的学习,还要求学生能够将理论应用到实践中去。《数据结构》这门课程旨在教会学生如何设计、分析和实现各类数据结构以及相关算法,以解决实际...

    数据结构教程

    ### 数据结构教程知识点梳理 #### 第一课:数据结构的基本概念和术语 - **教学目的**:通过本课程,学生将能够理解数据结构的基本概念及其重要术语,为进一步深入学习打下坚实的基础。 - **教学重点**:理解数据、...

    数据结构教程(第3版)ppt 和上机指导源程序还有数据结构教程-源程序

    为了帮助学生和自学者更深入地掌握这一核心课程,《数据结构教程(第3版)》应运而生,它是一份融合了理论教学和实践操作的综合教程。 首先,让我们来探讨《数据结构教程(第3版)》的PPT讲稿。这份讲稿是教材内容...

    算法与数据结构教程(C++版)源码唐宁九

    《算法与数据结构教程(C++版)》是学习计算机科学基础的重要教材,由唐宁九编著。这本书深入浅出地介绍了各种经典的算法和数据结构,并提供了完整的C++源码,便于读者理解和实践。在C++编程语言的环境下,理解和...

Global site tag (gtag.js) - Google Analytics