java数据结构是什么

java数据结构是什么

java数据结构是什么

我们为大家收集整理了关于java数据结构,以方便大家参考。数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。

?Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:

?枚举(Enumeration)

?位集合(BitSet)

?向量(Vector)

?栈(Stack)

?字典(Dictionary)

?哈希表(Hashtable)

?属性(Properties)

?枚举(Enumeration)

?枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。枚举(The

?Enumeration)接口定义了一种从数据结构中取回连续元素的方式。

?例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。

?关于枚举接口的更多信息,请参见枚举(Enumeration)。

?位集合(BitSet)

?位集合类实现了一组可以单独设置和清除的位或标志。

Java数据结构和算法

Java数据结构和算法 一、数组于简单排序 (1) 二、栈与队列 (4) 三、链表 (7) 四、递归 (22) 五、哈希表 (25) 六、高级排序 (25) 七、二叉树 (25) 八、红—黑树 (26) 九、堆 (36) 十、带权图 (39) 一、数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。 一维数组 一维数组(one-dimensional array )实质上是相同类型变量列表。要创建一个数组,你必须首先定义数组变量所需的类型。通用的一维数组的声明格式是:type var-name[ ]; 获得一个数组需要2步。第一步,你必须定义变量所需的类型。第二步,你必须使用运算符new来为数组所要存储的数据分配内存,并把它们分配给数组变量。这样Java 中的数组被动态地分配。如果动态分配的概念对你陌生,别担心,它将在本书的后面详细讨论。 数组的初始化(array initializer )就是包括在花括号之内用逗号分开的表达式的列表。逗号分开了数组元素的值。Java 会自动地分配一个足够大的空间来保存你指定的初始化元素的个数,而不必使用运算符new。 Java 严格地检查以保证你不会意外地去存储或引用在数组范围以外的值。Java 的运行系统会检查以确保所有的数组下标都在正确的范围以内(在这方面,

Java 与C/C++ 从根本上不同,C/C++ 不提供运行边界检查)。 多维数组 在Java 中,多维数组(multidimensional arrays )实际上是数组的数组。你可能期望,这些数组形式上和行动上和一般的多维数组一样。然而,你将看到,有一些微妙的差别。定义多维数组变量要将每个维数放在它们各自的方括号中。例如,下面语句定义了一个名为twoD 的二维数组变量。 int twoD[][] = new int[4][5]; 简单排序 简单排序中包括了:冒泡排序、选择排序、插入排序; 1.冒泡排序的思想: 假设有N个数据需要排序,则从第0个数开始,依次比较第0和第1个数据,如果第0个大于第1个则两者交换,否则什么动作都不做,继续比较第1个第2个…,这样依次类推,直至所有数据都“冒泡”到数据顶上。 冒泡排序的的java代码: Public void bubbleSort() { int in,out; for(out=nElems-1;out>0;out--) for(in=0;ina[in+1]) Swap(in,in+1); } } 算法的不变性:许多算法中,有些条件在算法执行过程中始终是不变的。这些条件被称为算法的不变性,如果不变性不为真了,则标记出错了; 冒泡排序的效率O(N*N),比较N*N/2,交换N*N/4; 2. 选择排序的思想:

数据结构复习资料,java数据结构期末考试

第二章算法分析 1.算法分析是计算机科学的基础 2.增长函数表示问题(n)大小与我们希望最优化的值之间的关系。该函数表示了该算法的时间复杂度或空间复杂度。增长函数表示与该问题大小相对应的时间或空间的使用 3.渐进复杂度:随着n的增加时增长函数的一般性质,这一特性基于该表达式的主项,即n 增加时表达式中增长最快的那一项。 4.渐进复杂度称为算法的阶次,算法的阶次是忽略该算法的增长函数中的常量和其他次要项,只保留主项而得出来的。算法的阶次为增长函数提供了一个上界。 5.渐进复杂度:增长函数的界限,由增长函数的主项确定的。渐进复杂度类似的函数,归为相同类型的函数。 6.只有可运行的语句才会增加时间复杂度。 7. O() 或者大O记法:与问题大小无关、执行时间恒定的增长函数称为具有O(1)的复杂度。 增长函数阶次 t(n)=17 O(1) t(n)=3log n O(log n) t(n)=20n-4 O(n) t(n)=12n log n + 100n O(n log n) t(n)=3n2+ 5n - 2 O(n2) t(n)=8n3+ 3n2O(n3) t(n)=2n+ 18n2+3n O(2n) 8.所有具有相同阶次的算法,从运行效率的角度来说都是等价的。 9.如果算法的运行效率低,从长远来说,使用更快的处理器也无济于事。 10.要分析循环运行,首先要确定该循环体的阶次n,然后用该循环要运行的次数乘以它。(n 表示的是问题的大小) 11.分析嵌套循环的复杂度时,必须将内层和外层循环都考虑进来。 12.方法调用的复杂度分析: 如:public void printsum(int count){ int sum = 0 ; for (int I = 1 ; I < count ; I++) sum += I ; System.out.println(sun); } printsum方法的复杂度为O(n),计算调用该方法的初始循环的时间复杂度,只需把printsum方法的复杂度乘以该循环运行的次数即可。所以调用上面实现的printsum方法的复 杂度为O(n2)。 13指数函数增长> 幂函数增长> 对数函数增长

数据结构与算法(JAVA语言版)_

目录 第一章 Java 与面向对象程序设计........................................................................................1 Java 语言基础知识....................................................................................................1 基本数据类型及运算.......................................................................................1 流程控制语句...................................................................................................3 字符串...............................................................................................................3 数组...................................................................................................................5 Java 的面向对象特性................................................................................................7 类与对象...........................................................................................................7 继承...................................................................................................................9 接口.................................................................................................................10 异常.........................................................................................................................11 Java 与指针..............................................................................................................12 数据结构与算法基础.............................................................................................15 数据结构.................................................................................................................15 基本概念.........................................................................................................15 抽象数据类型.................................................................................................17 小结.................................................................................................................19 算法及性能分析.....................................................................................................19 算法.................................................................................................................19 时间复杂性.....................................................................................................20 空间复杂性.....................................................................................................24 算法时间复杂度分析.....................................................................................25 最佳、最坏与平均情况分析.........................................................................27 均摊分析.........................................................................................................29 线性表.....................................................................................................................32 线性表及抽象数据类型.........................................................................................32 线性表定义.....................................................................................................32 线性表的抽象数据类型.................................................................................32 List 接口 ..........................................................................................................34 Strategy 接口 ...................................................................................................35 线性表的顺序存储与实现.....................................................................................36 线性表的链式存储与实现.....................................................................................42 单链表.............................................................................................................42 双向链表.........................................................................................................46 线性表的单链表实现.....................................................................................48 两种实现的对比.....................................................................................................53 基于时间的比较.............................................................................................53 基于空间的比较.............................................................................................53 链接表.....................................................................................................................54 基于结点的操作.............................................................................................54 链接表接口.....................................................................................................54 基于双向链表实现的链接表.........................................................................56 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.2 1.2.1 1.2.2 1.2.3 1.3 1.4 第二章 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 第三章 3.1 3.1.1 3.1.2 3.1.3 3.1.4 3.2 3.3 3.3.1 3.3.2 3.3.3 3.4 3.5 3.4.1 3.4.2 3.5.1 3.5.2 3.5.3

数据结构(java)复习题及答案

一、选择题 1、数据结构在计算机内存中的表示是指____A__ A.数据的存储结构 B.数据结构 C. 数据的逻辑结构 D.数据元素之间的关系 2、若一个算法的时间复杂度用T(n)表示,其中n的含义是( A )A.问题规模 B.语句条数 C.循环层数 D.函数数量 3、下列选项中与数据存储结构无关的术语是( D ) A.顺序表 B.链表 C.链队列 D.栈 4、已知循环队列的存储空间大小为m,队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置,则向队列中插入新元素时,修改指针的操作是( D ) =(rear-1)%m; =(front+1)%m; =(front-1)%m; =(rear+1)%m; 5、栈和队列的共同点是__C______ A.都是先进后出 B.都是先进先出 C.只允许在端点处插入和删除元素 D.没有共同点 6、已知一堆栈的进栈序列为1234,则下列哪个序列为不可能的出栈序列______D__ 7、具有线性结构的数据结构是( C ) A.树 B.图 C.栈和队列 D.广义表 8、假设以数组A[60]存放循环队列的元素,其头指针是front=47,当前队列有50个元素,则队列的尾指针值为( B ) A.3 B.37 C.50 D.97

9、若栈采用链式存储结构,则下列说法中正确的是( B ) A.需要判断栈满且需要判断栈空 B.不需要判断栈满但需要判断栈空 C.需要判断栈满但不需要判断栈空 D.不需要判断栈满也不需要判断栈空 10、若一棵具有n(n>0)个结点的二叉树的先序序列与后序序列正好相反,则该二叉树一定是( C ) A.结点均无左孩子的二叉树 B.结点均无右孩子的二叉树 C.高度为n的二叉树 D.存在度为2的结点的二叉树 11、若一棵二叉树中度为l的结点个数是3,度为2的结点个数是4,则该二叉树叶子结点的个数是( B ) 12、在n个结点的线索二叉树中,线索的数目为_C_______ A.n-1 B. n +1 13、一棵完全二叉树有1001个结点,其中有____B_____叶子结点 15、一个有n个顶点的无向图最多有___C____条边。 A. n B. n(n-1) C. n(n-1)/2 D. 2n 16、以v1为起始结点对下图进行深度优先遍历,正确的遍历序列是( D )

《数据结构Java版》习题解答

第0章Java程序设计基础 (1) 【习0.1】实验0.1 哥德巴赫猜想。 (1) 【习0.2】实验0.2 杨辉三角形。 (1) 【习0.3】实验0.3 金额的中文大写形式。 (1) 【习0.4】实验0.4 下标和相等的数字方阵。 (1) 【习0.5】实验0.5 找出一个二维数组的鞍点 (2) 【习0.6】实验0.6 复数类。 (2) 【习0.7】实验0.8 图形接口与实现图形接口的类 (2) 第1章绪论 (3) 【习1.1】实验1.1 判断数组元素是否已按升序排序。 (3) 【习1.2】实验1.3 用递归算法求两个整数的最大公因数。 (3) 第2章线性表 (5) 【习2.1】习2-5 图2.19的数据结构声明。 (5) 【习2.2】习2-6 如果在遍历单链表时,将p=p.next语句写成p.next=p,结果会怎样? (5) 【习2.3】实验2.2 由指定数组中的多个对象构造单链表。 (5) 【习2.4】实验2.2 单链表的查找、包含、删除操作详见8.2.1。 (5) 【习2.5】实验2.2 单链表的替换操作。 (6) 【习2.6】实验2.2 首尾相接地连接两条单链表。 (6) 【习2.7】实验2.2 复制单链表。 (6) 【习2.8】实验2.2 单链表构造、复制、比较等操作的递归方法。 (7) 【习2.9】建立按升序排序的单链表(不带头结点)。 (8) 【习2.10】实验2.6 带头结点的循环双链表类,实现线性表接口。 (10) 【习2.11】实验2.5 建立按升序排序的循环双链表。 (14) 第3章栈和队列 (17) 【习3.1】习3-5 栈和队列有何异同? (17) 【习3.2】能否将栈声明为继承线性表,入栈方法是add(0,e),出栈方法是remove(0)?为什么? (17) 【习3.3】能否用一个线性表作为栈的成员变量,入栈方法是add(0,e),出栈方法是remove(0)? 为什么? (17) 【习3.4】能否将队列声明为继承线性表,入队方法是add(e),出队方法是remove(0)?为什么? (17) 第4章串 (18) 【习4.1】实验4.6 找出两个字符串中所有共同的字符。 (18) 【习4.2】习4-9(1) 已知目标串为"abbaba"、模式串为"aba",画出其KMP算法的匹配过程,并给出比较次数。 (18)

数据结构(Java版)-线性表的实现与应用完整版

数据结构(Java版)-线性表的实现与应用完整版

实验报告 课程名称数据结构 实验项目线性表的实现及应用 实验仪器PC机一台 学院_____ 专业 班级/学号 姓名 实验日期 成绩 指导教师

北京信息科技大学 信息管理学院 (数据结构课程上机)实验报告 专业: 班级: 学号: 姓名: 成绩: 实验名称线性表的实现及应用实验地点实验时间 1.实验目的: (1)理解用顺序表实现线性表的特点;熟练掌握顺序表的基本操作;学会利用顺序表解决实际应用问题。 (2)熟练掌握单链表的使用;理解用链表实现线性表的特点;了解链表的多种形式;学会利用单链表解决实际应用问题。 2.实验要求: (1)学时为8学时; (2)能在机器上正确、调试运行程序; (3)本实验需提交实验报告; (4)实验报告文件命名方法:数据结构实验_信管16xx_学号_姓名.doc。 3.实验内容和步骤: 第一部分顺序表的实现与应用 (1)基于顺序表实现线性表的以下基本操作: public interface LList { //线性表接口,泛型参数T表示数据元素的数据类型 boolean isEmpty(); //判断线性表是否空 int size(); //返回线性表长度 T get(int i); //返回第i(i≥0)个元素 void set(int i, T x); //设置第i个元素值为x void insert(int i, T x); //插入x作为第i个元素 void insert(T x); //在线性表最后插入x元素 T remove(int i); //删除第i个元素并返回被删除对象 int search(T key); //查找,返回首次出现的关键字为key的元素的位序void removeAll(); //删除线性表所有元素 public String toString();//返回顺序表所有元素的描述字符串,形式为“(,)” } 要求:实现后应编写代码段对每个基本操作做测试。

数据结构(Java版)习题解答

A I N D E X 练习题答案

第一章练习题答案(a) n+(n–1)+(n–2)+…+2+1 = 2)1 (+ n n (b) n+(n–1)+(n–2)+…+2+1 = 2 )1 (+ n n f(n)≦c.g(n) →f(n)=O(g(n)) (a) f(n)=100n+9 c=101, g(n)=n, n0=10 得知f(n)=O(n) (b) f(n)=1000n2+100n–8 c=2000, g(n)= n2, n0=1 得知f(n)=O(n2) (c) f(n)=5*2n+9 n2+2 c=10, n0=5 得知f(n)=O(2n) f(n)≧c g(n) →f(n)=Ω(g(n)) (a) f(n)=3n+1 c=2, n0=1, g(n)=n 得知f(n)=Ω(n)(b) f(n)=100n2+4n+5 c=10, n0=1, g(n)= n2 得知f(n)=Ω(n2) (c) f(n)=8*2n+8n+16 c=8, n0=1, g(n)= 2n 得知f(n)=Ω(n2) c1.g(n)≦f(n)≦c2.g(n) →f(n)= Θ(g(n)) (a) f(n)=3n+2 c1=3, c2=6, n0=1 得知f(n) = Θ (n) (b) f(n)=9n2+4n+2 c1=9, c2=16, n0=1 得知f(n) = Θ (n2) (c) f(n)=8n4+5n3+5 c1=8, c2=20, n0=1 得知f(n) = Θ (n4)

练习题解答 第二章练习题答案 1. 分别以行为主和以列为主说明之。 (a) 以行为主 A(i, j)=l0+(i–1)*u2*d+(j–1)*d (b) 以列为主 A(i, j)=l0+(j–1)*u1*d+(i–1)*d 2. 以列为主 A(i, j)=l0+(j–12)*md+(i–l1)d m=u1–l1+1=5–(–3)+1=9 m=u2–l2+1=2–(–4)+1=7 A(1, 1) =100+(1–(–4))*9+(1–(–3)) =100+45+4=149 3. 分别以行为主和以列为主的说明。 由于数组为A(1:u1, 1:u2, 1:u3),因此p = u1-l1+1, q = u2- l2+1, r = u3- l3+1 所以p = u1-1+1 = u1, q = u2-1+1 = u2, r = u3-1+1 = u3 (a) 以行为主 A(i, j, k)=l0 + (i–1)*u2*u3*d + (j–1)*u3*d +(k-1) (b) 以列为主 A(i, j, k)=l0 + (k–1)*u1*u2*d + (j–1)*u1*d + (i-1)*d 4. 以列为主:A(i, j, k)=l0 + (k–l3)*pqd + (j–l2)*pd + (i-l1)*d p = 5-(-3) + 1 = 9, q = 2-(-4)+1 = 7, r = 5-1+1 = 5 A(2, 1, 2) = 100 + (2-1)*9*7*1 + (1-(-4))*9*1 + (2-(-3))*1 = 100 + 63 + 45 + 5 = 253

数据结构Java版第二章习题

(按照自己的情况选作部分习题,不要抄袭) 第二章习题 顺序存储线性表 一判断题 1.线性表的逻辑顺序与存储顺序总是一致的。× 2.顺序存储的线性表可以按序号随机存取。√ 3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。× 4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。√ 5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。×6.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。√ 二单选题 (请从下列A,B,C,D选项中选择一项) 1.线性表是( A ) 。 (A) 一个有限序列,可以为空; (B) 一个有限序列,不能为空; (C) 一个无限序列,可以为空; (D) 一个无序序列,不能为空。 2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。插入一个元素时平均要移动表中的(A)个元素。 (A) n/2 (B) n+1/2 (C) n -1/2 (D) n 三填空题

1.在顺序表中做插入操作时首先检查___表是否满了______________。 四算法设计题 1.设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试写一算法,将x 插入到线性表的适当位置上,以保持线性表的有序性。并且分析算法的时间复杂度。2.已知一顺序表A,其元素值非递减有序排列,编写一个函数删除顺序表中多余的值相同的元素。 3.编写一个函数,从一给定的顺序表A中删除值在x~y(x<=y)之间的所有元素,要求以较高的效率来实现。 提示:可以先将顺序表中所有值在x~y之间的元素置成一个特殊的值,并不立即删除它们,然后从最后向前依次扫描,发现具有特殊值的元素后,移动其后面的元素将其删除掉。 4.线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R 中的字符按字母字符、数字字符和其它字符的顺序排列。要求利用原来的存储空间,元素移动次数最小。(研54) 5.线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前m个元素和后n个元素进行整体互换。即将线性表 (a1, a2, … , a m, b1, b2, … , b n)改变为: (b1, b2, … , b n , a1, a2, … , a m)。 五上机实习题目 约瑟夫环问题 约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,

Java的数据结构相关的类实现原理

Java的数据结构相关的类实现原理 List接口 List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 LinkedList List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。 此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。 所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。 注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使 用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示: List list = Collections.synchronizedList(new LinkedList(...)); 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛 出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。 注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何硬性保证。快速失败迭代器尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。 ArrayList

数据结构复习资料,java数据结构期末考试

第二章算法分析 1?算法分析是计算机科学的基础 2?增长函数表示问题(n)大小与我们希望最优化的值之间的关系。该函数表示了该算法的时间复杂度或空间复杂度。增长函数表示与该问题大小相对应的时间或空间的使用 3?渐进复杂度:随着n的增加时增长函数的一般性质,这一特性基于该表达式的主项,即n 增加时表达式中增长最快的那一项。 4?渐进复杂度称为算法的阶次,算法的阶次是忽略该算法的增长函数中的常量和其他次要 项,只保留主项而得出来的。算法的阶次为增长函数提供了一个上界。 5?渐进复杂度:增长函数的界限,由增长函数的主项确定的。渐进复杂度类似的函数,归为相同类型的函数。 6?只有可运行的语句才会增加时间复杂度。 7. 0()或者大0记法:与问题大小无关、执行时间恒定的增长函数称为具有0 (1)的复 杂度。 9?如果算法的运行效率低,从长远来说,使用更快的处理器也无济于事。 10. 要分析循环运行,首先要确定该循环体的阶次n,然后用该循环要运行的次数乘以它。(n 表示的是问题的大小) 11. 分析嵌套循环的复杂度时,必须将内层和外层循环都考虑进来。 12?方法调用的复杂度分析: 如: public void printsum(int count){ int sum = 0 ; for (int I = 1 ; I < count ; I++) sum += I ; System.out.pri ntln(sun); } printsum方法的复杂度为O ( n),计算调用该方法的初始循环的时间复杂度,只需把printsum方法的复杂度乘以该循环运行的次数即可。所以调用上面实现的printsum方法的复亠、, 2 杂度为O(n)。 13指数函数增长> 幕函数增长> 对数函数增长第三章集合概述一一栈 1?集合是一种聚集、组织了其他对象的对象。它定义了一种特定的方式,可以访问、管理所包含的对象(称为该集合的元素)。集合的使用者一一通常是软件系统中的另一个类或对象只能通过这些预定的方式与该集合进行交互。 2?集合可分为线性集合和非线性集合。线性集合是一种元素按直线方式组织的集合。非线性集合是一种元素按某种非直线方式组织的集合,例如按层次组织或按网状组织。从这种意义

《数据结构(Java语言版)》试卷1

长沙民政学院2015年上学期期末考试卷(A卷) 考试科目:《数据结构》考试形式:闭卷 适应班级:软开 1431-1439 一、单项选择(共20题,每题2分, 共40分) 1、以下数据结构中哪一个是非线性结构() A. 队列 B. 栈 C.二叉树 D. 线性表 2、()不是算法的主要特性。 A.输入性 B.输出性 C.有穷性 D.高效性 3、()不是线性表的存储结构。 A.叉链表 B.单链表 C.双向链表 D.循环链表 4、线性表是: A.一个有限序列,可以为空; B. 一个有限序列,不能为空; C. 一个无限序列,可以为空; D. 一个无序序列,不能为空 5、用链表表示线性表的优点是()。 A.便于随机存取 B.花费的存储空间较顺序存储少 C.便于插入和删除 D.数据元素的物理顺序与逻辑顺序相同 6、若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。 A. 单链表 B. 仅有头指针的单循环链表 C. 双链表 D.仅有尾指针的单循环链表 7、栈中元素的进出原则是() A. 先进先出 B.后进先出 C. 栈空则进 D. 栈满则出 8、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi 为( ) A.i B.n=i C.n-i+1 D.不确定 9、若依次输入数据元素序列{a,b,c,d,e,f,g}进栈,出栈操作可以和入栈操作间隔进行,则下列哪个元素序列可以由出栈序列得到( ) A.{ c,d,b,e,g,a,f} B.{ f,e,g,d,a,c,b} C.{e,f,d,g,b,c,a} D.{d,e,c,f,b,g,a} 10、一个栈的入栈序列是1,2,3,4,5,则下列序列中不可能的出栈序列是( ) A. 2,3,4,1,5 B. 2,3,1,4,5 C.5,4,1,3,2 D.1,5,4,3,2 11、判断一个循环队列( m0为最大队列长度(以元素为单位),front和rear分别为队列的队头指针和队尾指针 ) 为空队列的条件是( )。 A. front == rear B. front != rear C. front == (rear+1) % m0 D. front != (rear+1) % m0 12、判断一个循环队列( m0为最大队列长度(以元素为单位),front和rear分别为队列的队头指针和队尾指针 )为满队列的条件是( )。 A. front== rear B.front!= rear C. front==( rear+1) % m0 D. front!=( rear+1) % m0 13、串是一种特殊的线性表,其特殊性体现在()。 A.可以顺序存储B.数据元素是一个字符 C.可以链式存储 D.数据元素可以是多个字符 14、假设S=“abcaabcaaabca”,T=“bca”, (T,3) (其中3为索引号,索引号从0开始编号)的结果是() A.1 B.5 C.10 D.0 15、二叉树的数据结构描述了数据之间的()关系。 A.链接关系 B.层次关系 C.网状关系 D.随机关系 16、()遍历方法在遍历它的左子树和右子树后再遍历它自身。 A.先序遍历 B.后序遍历 C. 中序遍历 D. 层次遍历 17、在构造哈夫曼树的过程中说法正确的是()。 A. 使权值越大的叶结点越远离根结点,而权值越小的叶结点越靠近根结点 B.使权值越大的叶结点越靠近根结点,而权值越小的叶结点越远离根结点 C. 最终是带权路径长度最大的二叉树 D. 构造的过程是一次到位 18、55为最第一趟快速排序的基准值,执行一趟快速排序能够得到的序列是(A )。 A. [12,27,45,41] 55 [34,63,72] B. [45,34,12,41] 55 [72,63,27] C. [63,12,34,45,27] 55 [41,72] D. [41,12,34,45,27] 55 [72,63] 19、对线性表进行二分查找时,要求线性表必须( )。 A.以顺序方式存储 B.以链接方式存储

Java数据结构和算法笔记

Java数据结构和算法 第0讲综述 参考教材:Java数据结构和算法(第二版),[美] Robert lafore 1. 数据结构的特性 数据结构优点缺点 数组插入快;如果知道下标,可以非常快地存取查找慢,删除慢,大小固定 有序数组比无序的数组查找快删除和插入慢,大小固定 栈提供后进先出方式的存取存取其他项很慢 队列提供先进先出方式的存取存取其他项很慢 链表插入快,删除快查找慢 二叉树查找、插入、删除都快(如果树保持平衡)删除算法复杂 红-黑树查找、插入、删除都快;树总是平衡的算法复杂 算法复杂 2-3-4树查找、插入、删除都快;树总是平衡的;类 似的树对磁盘存储有用 哈希表如果关键字已知,则存储极快;插入快删除慢,如果不知道关键字则存 储很慢,对存储空间使用不充分堆插入、删除快;对大数据项的存取很快对其他数据项存取慢 图对现实世界建模有些算法慢且复杂 2. 经典算法总结 查找算法:线性查找和二分查找 排序算法: 用表展示 第一讲数组 1.Java中数组的基础知识 1)创建数组 在Java中把数组当作对象来对待,因此在创建数组时必须使用new操作符: 一旦创建数组,数组大小便不可改变。 2)访问数组数据项

数组数据项通过方括号中的下标来访问,其中第一个数据项的下标是0: 3)数组的初始化 当创建数组之后,除非将特定的值赋给数组的数据项,否则它们一直是特殊的null对 2.面向对象编程方式 1)使用自定义的类封装数组

2)添加类方法实现数据操作 3.有序数组 1)有序数组简介以及其优点 有序数组是一种数组元素按一定的顺序排列的数组,从而方便使用二分查找来查找数组中特定的元素。有序数组提高了查询的效率,但并没有提高删除和插入元素的效率。 2)构建有序数组

Java数据结构与经典算法——高手必会

1.大O表示法:粗略的量度方法即算法的速度是如何与数据项的个数相关的 算法大O表示法表示的运行时间 线性查找 O(N) 二分查找 O(logN) 无序数组的插入 O(1) 有序数组的插入 O(N) 无序数组的删除 O(N) 有序数组的删除 O(N) O(1)是最优秀的,O(logN)良好,O(N)还可以,O(N2)稍差(在冒泡法中见到) 2.排序 public class JWzw { //插入排序 public void insertArray(Integer []in){ int tem = 0; int num = 0; int upnum = 0; for (int i = 0; i < in.length; i++) { for (int j = i - 1; j >= 0; j--) { num++; if (in[j+1] < in[j]) { tem = in[j+1]; in[j+1] = in[j]; in[j] = tem; upnum++; } else { break; } } } for (int i = 0; i < in.length; i++) { System.out.print(in[i]); if(i < in.length - 1) { System.out.print(",");

} } System.out.println(); System.out.println("插入排序循环次数:" + num); System.out.println("移动次数:" + upnum); System.out.print("\n\n\n"); } //选择排序 public void chooseArray(Integer []in){ int tem = 0; int num = 0; int upnum = 0; for(int i = 0;i < in.length;i++) { for(int j = i;j < in.length - 1;j++){ num++; if(in[j+1] < in[j]){ tem = in[j+1]; in[j + 1] = in[j]; in[j] = tem; upnum++; } } } for (int i = 0; i < in.length; i++) { System.out.print(in[i]); if(i < in.length - 1) { System.out.print(","); } } System.out.println(); System.out.println("选择排序循环次数:" + num); System.out.println("移动次数:" + upnum); System.out.print("\n\n\n"); } //冒泡排序 public void efferArray(Integer []in){ int tem = 0; int num = 0; int upnum = 0;

相关文档
最新文档