以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 Java/Eclipse 』 (http://bbs.xml.org.cn/list.asp?boardid=41) ---- 数据结构系列教程------精讲(JAVA版) (http://bbs.xml.org.cn/dispbbs.asp?boardid=41&rootid=&id=39388) |
-- 作者:卷积内核 -- 发布时间:10/26/2006 2:22:00 PM -- 数据结构系列教程------精讲(JAVA版) 接触不少程序员,都能够独立的作一下小型应用系统,和他们交谈起来才发现,他们纯粹是程序员,对基础的掌握太差,比喻java程序员,就是对jdk和各种框架特别的熟悉,能够熟练的运用其中的各种包、类以及一些组件,确实能做出一下系统来,但是涉及到一些特殊的设计方法来就不行了,对基础掌握太差,包括现在的很多培训,都是灌输这些所谓的实际应用的东西,学好基础才是最关键的东西,学一门语言很快,没有很好的基础、清晰的思路只能照葫芦画瓢了,为此,笔者结合自己的学习经验写了系列教程,主要包括数据结构的全部内容:线性表、树、图、数组、集合、矩阵、排序、查找、哈希表,并将java的设计思想、方法及一些常见的算法、设计模式贯穿其中,希望能给初学者一个很好的帮助,由于本人水平有限,同时请大家给与批评指正! 第一讲 线性表 数据结构包括数据的逻辑结构、储存结构以及对数据的操作,线性表的含义就是:除了第一个和最后一个数据元素,其他的只有一个前驱元素和一个后继元素,如下图: A--->B--->C--->D 这个就是一个最简单的线性表的实例,结合定义可以很好的理解的,数据结构中最常见的就是提到抽象数据类型,所谓抽象数据类型就是在基本数据类型支持下用户新设计的数据类型,通俗的说就是用户对基本数据类型(整型、浮点型等等)的组合应用成自己的一种新型的数据类型,也就是java中接口和抽象类,这么说可能有些不妥,不过这样最好理解,前面讲到数据结构包括对数据的操作,这个设计数据结构的最终目的,下面我们就讲讲java数据结构中的线性表的设计思想。 由于线性表的数据集合可以表示为序列:A1,A2,A3……….An-1,每个元素的类型都是任意的,对于这个集合的操作可以归结如下: (1)求出当前集合中数据元素个数(size); (2)向当前数据集合任意位置插入新的数据(insert); (3)删除当前数据集合中的任意数据(delete); (4)获取当前数据集合中的任意数据(getData); (5)判断当前数据集合是否为空; ,由于存在很多不同形式的线性表结构,对其操作方式当然也不一样,这样就要求设计一个大家都能使用的数据类型,由前面的讲述大家就可以想到必须要设计一个抽象数据类型,也就是一个接口,这时可能有人问为什么不设计一个抽象类阿?这个问题留个大家思考,可以到论坛发表。Java中可以这样定义这个接口: public interface List { /** * @author 天意 */ public void insert(int i,Object obj ) throws Exception;//在任意位置插入数据 public Object delete(int i) throws Exception;//删除任意位置的数据 public Object getData(int i) throws Exception;//获取任意位置的数据 public int size();// 获取当前集合的大小 public boolean isEmpty();//判断当前集合是否为空 } ,由于所有线性表的操作都是围绕以上而来的,所以上面的接口就可以通用于所有线性表了,这就告诉大家在设计程序时要做好充分的考虑,强调一个“广”字。 线性表包括顺序表和链式表,首先讲一下顺序表,顺序表顾名思义,就是数据元素按一定组合在一起的,逻辑上相邻的元素在物理储存上也是相邻的,如下如示例: A0 A1 A2 A3 A4 A5 …… 0 1 2 3 4 5 maxSize-1
|
-- 作者:卷积内核 -- 发布时间:10/26/2006 2:24:00 PM -- 线性表的概念大家应该还记得,链式表是线性表的一个分类,当然也具备线性表的所有特性了,只不过它的结构方式特异而已,也就是和链子似的,和顺序表的不同之处在于链式表引入对象应用,就是其他语言中的指针,每个链子(我自己的说法)包含一个数据元素(element)和一个指针域(next),这个链子就称为节点,通俗的说有很多节点连接成的线性表就是链式表,根据其结构方式又可以分为单链表、单循环链表、双向链表,还有一种不常用的仿真链表,所有的链表都有一个共同的特征,都是由节点组成,根据前一章的思想我们很自然的会想到要构造一个节点类Node.java: public class Node { /** * @author 张钰 */ Object element;//数据元素 Node next; Node(Node nextval){ next=nextval; } Node(Object obj,Node nextval){ element=obj; next=nextval; } public Object getElement() { return element; } public void setElement(Object obj) { element = obj; } public Node getNext() { return next; } public void setNext(Node nextval) { next = nextval; } public String toString(){ return element.toString(); } ,节点类的构造就是为了实现链表的操作,链表最常见的是单链表,单链表就是其每个节点都只有一个指向直接后继节点的指针,其中包括带头节点的和不带头节点的,根据单链表的结构我们可以设计如下的类LinList.java(注意和java中的LinkList不一样,LinkList是个线性结构容器,提供线性表、堆栈、队列等操作): /** * @author 张钰 * */ public class LinList implements List { Node head;//头指针 Node current;//当前节点位置 int size;//数据元素个数 LinList(){ head=current=new Node(null); size=0; } public void index(int i) throws Exception{ //定位元素 if(i<-1||i>size-1){ throw new Exception("参数错误"); } if(i==-1) return; current=head.next; int j=0; while((current!=null)&&j<i){ current=current.next; j++; } } public void insert(int i, Object obj) throws Exception { // 插入 if(i<0||i>size){ throw new Exception("参数错误"); } index(i-1); current.setNext(new Node(obj,current.next)); size++; } public Object delete(int i) throws Exception { // 删除 if (size==0){ throw new Exception("链表已空无元素可删除!"); } if(i<0||i>size-1){ throw new Exception("参数错误"); } index(i-1); Object obj=current.next.getElement(); current.setNext(current.next.next); size--; return obj; } public Object getData(int i) throws Exception { // 获取元素 if(i<-1||i>size-1){ throw new Exception("参数错误"); } index(i); return current.getElement(); } public int size() { // 获取元素个数 return size; } /* (非 Javadoc) * @see List#isEmpty() */ public boolean isEmpty() { // 判断是否为空 return size==0; } } ,设计说明: (1)构造函数完成三件事:创建头节点,使head和current均表示所创建的头节点,置s ize为0; (2)定位成员函数index(int i)的实现,其设计方式是:用一个循环过程从头开始计数寻找第i个节点; 顺序表和单链表的比较:顺序表和单链表的逻辑功能完全一样,但是两者的应用背景以及不同情况下的使用效率略有不同,顺序表的主要优点就是支持随机读取,以及内存空间利用效率高,顺序表的主要特点就是需要给出数组的最大数据元素个数,而这通常很难准确做到,另外,顺序表的插入和删除操作时需要移动较多的数据元素,单链表的缺点就是每个节点中都有个指针,所以其空间利用率略低于顺序表,单链表不支持随机读取。 单链表另一种常见的形势就是循环单链表,其结构特点就是链表中最后一个节点的指针不再是结束标记,而是指向整个链表的第一个节点,从而使单链表形成一个环,,就是在构造函数中增加head.next=head,在定位函数index(i)中,把循环结束条件current!=null换成current!=head,这样最后一个节点就循环到第一个了!链表最常见的一个应用就是循环双链表,java中的LinkedList就是通过循环双链表来实现的,其长度可以随着数据元素的增减很容易的变化,LinkedList提供了线性表、堆栈、队列、双端队列等数据结构所要求的全部成员函数,例如addFirst()和removeFirst()就是支持堆栈所要求的成员函数,这里就不过多讲解了,回到循环双链表,双向链表中每个节点包括三个域:element、next、prior,其中element是数据元素,next是指向后继节点的对象应用,prior是指向前驱节点的对象应用, prior element next |
-- 作者:卷积内核 -- 发布时间:10/26/2006 2:26:00 PM -- 第三讲 堆栈和队列 堆栈和队列都是特殊的线性表,他们的逻辑关系完全相同,差别是线性表的插入和删除操作不受限制,而堆栈只能在栈顶插入和删除,队列只能在队尾插入、队头删除,堆栈和队列都可以分别用顺序储存结构和链式存储结构,堆栈的操作主要有入栈、出栈、取栈顶元素、是否为空,可以设计通用接口Stack..ava如下: satck top=5 maxStackSize-1 |
-- 作者:yfaclx -- 发布时间:10/22/2008 6:10:00 PM -- good |
-- 作者:kooo -- 发布时间:12/1/2008 10:07:00 AM -- TOP |
-- 作者:驷马难追 -- 发布时间:12/19/2008 4:12:00 PM -- 是个好地方…… 还有开课的…… |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
109.375ms |