数据结构(Java版)(第2版)》习题解答_第1页
数据结构(Java版)(第2版)》习题解答_第2页
数据结构(Java版)(第2版)》习题解答_第3页
数据结构(Java版)(第2版)》习题解答_第4页
数据结构(Java版)(第2版)》习题解答_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构(java版)(第2版)习题解答叶核亚 编著目录第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的数据结构

2、声明。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

3、.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

4、算法的匹配过程,并给出比较次数。18【习4.3】 习4-9(2) 已知target=ababaab、pattern=aab,求模式串的next数组,画出其kmp算法的匹配过程,并给出比较次数。18第5章 数组和广义表20【习5.1】 求一个矩阵的转置矩阵。20第6章 树和二叉树21【习6.1】 画出3个结点的各种形态的树和二叉树。21【习6.2】 找出分别满足下面条件的所有二叉树。21【习6.3】 输出叶子结点。21【习6.4】 求一棵二叉树的叶子结点个数。22【习6.5】 判断两棵二叉树是否相等。22【习6.6】 复制一棵二叉树。23【习6.7】 二叉树的替换操作。23【习6.8】 后根次序

5、遍历中序线索二叉树。24第7章 图25第8章 查找26【习8.1】 实验8.1 顺序表的查找、删除、替换、比较操作。26【习8.2】 实验8.2 单链表的全部替换操作。28【习8.3】 实验8.2 单链表的全部删除操作。28【习8.4】 折半查找的递归算法。29【习8.5】 二叉排序树查找的递归算法。29【习8.6】 二叉排序树插入结点的非递归算法。30【习8.7】 判断一棵二叉树是否为二叉排序树。31第9章 排序32【习9.1】 判断一个数据序列是否为最小堆序列。32【习9.2】 归并两条排序的单链表。32【习9.3】 说明二叉排序树与堆的差别。34图0.1 下标和相等的数字方阵算法描述1图

6、2.1 p.next=p将改变结点间的链接关系5图4.1 目标串abbaba和模式串aba的kmp算法模式匹配过程18图4.2 目标串ababaab和模式串aab的kmp算法模式匹配过程19图6.1 3个结点树和二叉树的形态21图6.2 单支二叉树21图9.2 归并两条排序的单链表33表4.1 模式串aab的next数组19第0章 java程序设计基础【习0.1】 实验0.1 哥德巴赫猜想。【习0.2】 实验0.2 杨辉三角形。【习0.3】 实验0.3 金额的中文大写形式。【习0.4】 实验0.4 下标和相等的数字方阵。输出下列方阵(当n=4时)。1267 或 1341035813 25911

7、491214 68121510111516 7131416采用二维数组实现。二维数组中,每一条斜线上各元素下标和相等,如图0.1所示。图0.1 下标和相等的数字方阵算法描述程序如下。public class upmat public static void main(string args) int n=4; /阶数 int mat = new intnn; int k=1; /k是自然数,递增变化 boolean up = true; /方向向上 for (int sum=0; sum=0; i-) matisum-i = k+; /k先赋值后自加 else for (int i=0; i=

8、sum; i+) matisum-i = k+; up=!up; /方向求反 for (int sum=n; sum2*n-1; sum+) /右下三角 if (up) for (int j=sum-n+1; jsum-n; j-) matsum-jj = k+; up=!up; for (int i=0; imat.length; i+) /输出二维数组元素 for (int j=0; jmati.length; j+) /i、j是行、列下标 system.out.print( +matij); system.out.println(); 【习0.5】 实验0.5 找出一个二维数组的鞍点【习

9、0.6】 实验0.6 复数类。【习0.7】 实验0.8 图形接口与实现图形接口的类第1章 绪论【习1.1】 实验1.1 判断数组元素是否已按升序排序。程序见例1.4的sortedarray.java。public static boolean issorted(int table) /判断整数数组是否已按升序排序 /若已排序返回true,否则返回false if (table=null) return false; for (int i=0; itablei+1) return false; return true;public static boolean issorted(comparab

10、le table) /判断对象数组是否已按升序排序 /若已排序返回true,否则返回false if (table=null) return false; for (int i=0; i0) return false; return true;【习1.2】 实验1.3 用递归算法求两个整数的最大公因数。public class gcd public static int gcd(int a, int b) /返回a,b的最大公因数,递归方法 if(b=0) return a; if(a0) return gcd(-a, b); if(b0) return gcd(a, -b); return

11、gcd(b, a%b); public static void main(string args) int a=12, b=18, c=24; system.out.println(gcd(+a+,+b+,+c+)=+gcd(gcd(a,b),c); /获得3个整数最大公因数 第2章 线性表【习2.1】 习2-5 图2.19的数据结构声明。table数组元素为单链表,声明如下:singlylinkedlist table【习2.2】 习2-6 如果在遍历单链表时,将p=p.next语句写成p.next=p,结果会怎样?使p.next指向p结点自己,改变了结点间的链接关系,丢失后继结点,如图2.

12、1所示。图2.1 p.next=p将改变结点间的链接关系【习2.3】 实验2.2 由指定数组中的多个对象构造单链表。在singlylinkedlist单链表类中,增加构造方法如下。public singlylinkedlist(e element) /由指定数组中的多个对象构造单链表 this.head = null; if (element!=null & element.length0) this.head = new node(element0); node rear=this.head; int i=1; while (ielement.length) rear.next = new

13、node(elementi+); rear = rear.next; 【习2.4】 实验2.2 单链表的查找、包含、删除操作详见8.2.1。单链表的以下查找、包含、删除等操作方法详见8.2.1顺序查找。public node search(e element, node start) /从单链表结点start开始顺序查找指定对象public node search(e element) /若查找到指定对象,则返回结点,否则返回nullpublic boolean contain(e element) /以查找结果判断单链表是否包含指定对象public boolean remove(e elem

14、ent) /移去首次出现的指定对象【习2.5】 实验2.2 单链表的替换操作。在singlylinkedlist单链表类中,增加替换操作方法如下。public boolean replace(object obj, e element) /将元素值为obj的结点值替换为element /若替换成功返回true,否则返回false,o(n) if (obj=null | element=null) return false; node p=this.head; while (p!=null) if (obj.equals(p.data) p.data = element; return true

15、; p = p.next; return false;【习2.6】 实验2.2 首尾相接地连接两条单链表。在singlylinkedlist单链表类中,增加替换操作方法如下。public void concat(singlylinkedlist list) /将指定单链表list链接在当前单链表之后 if (this.head=null) this.head = list.head; else node p=this.head; while (p.next!=null) p = p.next; p.next = list.head; 【习2.7】 实验2.2 复制单链表。在singlylink

16、edlist单链表类中,增加构造方法如下。public singlylinkedlist(singlylinkedlist list) /以单链表list构造新的单链表 /复制单链表 this.head = null; if (list!=null & list.head!=null) this.head = new node(list.head.data); node p = list.head.next; node rear = this.head; while (p!=null) rear.next = new node(p.data); rear = rear.next; p = p.

17、next; 【习2.8】 实验2.2 单链表构造、复制、比较等操作的递归方法。由指定数组中的多个对象构造单链表的操作也可设计为以下的递归方法:public singlylinkedlist(e element) /由指定数组中的多个对象构造单链表 this.head = null; if (element!=null) this.head = create(element,0);private node create(e element, int i) /由指定数组构造单链表,递归方法 node p=null; if (ielement.length) p = new node(element

18、i); p.next = create(element, i+1); return p;单链表的复制操作也可设计为以下的递归方法:public singlylinkedlist(singlylinkedlist list) /以单链表list构造新的单链表 this.head = copy(list.head);private node copy(node p) /复制单链表,递归方法 node q=null; if (p!=null) q = new node(p.data); q.next = copy(p.next); return q;比较两条单链表是否相等的操作也可设计为以下的递归方

19、法:public boolean equals(object obj) /比较两条单链表是否相等 if (obj = this) return true; if (obj instanceof singlylinkedlist) singlylinkedlist list = (singlylinkedlist)obj; return equals(this.head, list.head); return false;private boolean equals(node p, node q) /比较两条单链表是否相等,递归方法 if (p=null & q=null) return tru

20、e; if (p!=null & q!=null) return p.data.equals(q.data) & equals(p.next, q.next); return false;【习2.9】 建立按升序排序的单链表(不带头结点)。采用直接插入排序算法将一个结点插入到已排序的单链表中。import datastructure.linearlist.node; import datastructure.linearlist.singlylinkedlist; /不带头结点的单链表类public class sortedsinglylinkedlist extends singlylink

21、edlist public sortedsinglylinkedlist() super(); public boolean add(e element) /根据指定对象的大小插入在合适位置 if (element=null | !(element instanceof comparable) return false; /不能插入null或非comparable对象 comparable cmp = (comparable)element; if (this.head=null | pareto(this.head.data)=0) this.head = new node(element,

22、this.head); /头插入 else node front=null, p=this.head; while (p!=null & pareto(p.data)0) front = p; /front是p的前驱结点 p = p.next; front.next = new node(element, p); /中间/尾插入 return true; public static void main(string args) sortedsinglylinkedlist list = new sortedsinglylinkedlist(); int n=10; system.out.pri

23、nt(insert: ); for (int i=0; in; i+) int k = (int) (math.random()*100); /产生随机数 if (list.add(new integer(k) system.out.print(k+ ); system.out.println(nlist: +list.tostring(); 程序多次运行结果如下:insert: 22 48 50 9 71 71 19 67 50 80 list: (9, 19, 22, 48, 50, 50, 67, 71, 71, 80)insert: 42 33 52 89 13 11 50 29 78

24、 34 list: (11, 13, 29, 33, 34, 42, 50, 52, 78, 89)insert: 69 16 99 0 20 68 14 73 90 76 list1: (0, 14, 16, 20, 68, 69, 73, 76, 90, 99)【习2.10】 实验2.6 带头结点的循环双链表类,实现线性表接口。package datastructure.linearlist;import datastructure.linearlist.dlinknode; /导入双链表结点类import datastructure.linearlist.llist; /导入线性表接口p

25、ublic class chdoublylinkedlist implements llist /带头结点的循环双链表类 protected dlinknode head; /头指针 public chdoublylinkedlist() /构造空链表 this.head = new dlinknode(); /创建头结点,值为null this.head.prev = head; this.head.next = head; public boolean isempty() /判断双链表是否为空 return head.next=head; /以下算法同循环单链表,与单链表的差别在于,循环条

26、件不同 public int length() /返回双链表长度 int i=0; dlinknode p=this.head.next; /此句与单链表不同 while (p!=head) /循环条件与单链表不同 i+; p = p.next; return i; public e get(int index) /返回序号为index的对象 if (index=0) int j=0; dlinknode p=this.head.next; while (p!=head & j=0 & element!=null) int j=0; dlinknode p=this.head.next; wh

27、ile (p!=head & jindex) j+; p=p.next; if (p!=head) e old = (e)p.data; p.data = element; return old; return null; public string tostring() string str=(; dlinknode p = this.head.next; while (p!=head) str += p.data.tostring(); p = p.next; if (p!=head) str += , ; return str+); /双链表的插入、删除算法与单链表不同 public b

28、oolean add(int index, e element) /插入element对象,插入后对象序号为index /若操作成功返回true,o(n) if (element=null) return false; /不能添加空对象(null) int j=0; dlinknode front = this.head; while (front.next!=head & jindex) /寻找插入位置,若i=0,插入在头结点之后 j+; front = front.next; dlinknode q = new dlinknode(element, front, front.next);

29、/插入在front结点之后 front.next.prev = q; front.next = q; return true; public boolean add(e element) /在单链表最后添加对象,o(1) if (element=null) return false; /不能添加空对象(null) dlinknode q = new dlinknode(element, head.prev, head); head.prev.next = q; /插入在头结点之前,相当于尾插入 head.prev = q; return true; public e remove(int in

30、dex) /移除指定位置的对象,o(n) /返回被移除的原对象,指定位置序号错误时返回null e old = null; int j=0; dlinknode p=this.head.next; while (p!=head & jindex) /定位到待删除结点 j+; p = p.next; if (p!=head) old = (e)p.data; /操作成功,返回原对象 p.prev.next = p.next; /删除p结点自己 p.next.prev = p.prev; return old; public void clear() /清空线性表 this.head.prev =

31、 head; this.head.next = head; /以上实现llist接口 public static void main(string args) int i=0; chdoublylinkedlist list = new chdoublylinkedlist(); system.out.println(删除第+i+个结点+list.remove(0); system.out.println(list.tostring(); for (i=5; i=0; i-) list.add(0, new string(char)(a+i)+); for (i=0; i6; i+) list

32、.add(new string(char)(a+i)+);/ list.add(i, new string(char)(a+i)+); system.out.println(list.tostring(); system.out.println(删除第+i+个结点+list.remove(i); system.out.println(list.tostring(); 程序运行结果如下: 删除第0个结点null()(a, b, c, d, e, f, a, b, c, d, e, f)删除第6个结点a(a, b, c, d, e, f, b, c, d, e, f)【习2.11】 实验2.5 建

33、立按升序排序的循环双链表。package datastructure.linearlist;import datastructure.linearlist.dlinknode;import datastructure.linearlist.chdoublylinkedlist; /循环双链表类public class sortedchdlinkedlist extends chdoublylinkedlist /按升序排序的循环双链表类 public sortedchdlinkedlist() super(); public boolean add(e element) /根据指定对象的大小插

34、入在合适位置 /若操作成功返回true,o(n) if (element=null | !(element instanceof comparable) return false; /不能插入null或非comparable对象 comparable cmp = (comparable)element; if (this.head.prev!=head & pareto(this.head.prev.data)0) /非空双链表,插入在最后,o(1) dlinknode q = new dlinknode(element, head.prev, head); head.prev.next =

35、q; /插入在头结点之前,相当于尾插入 head.prev = q; return true; dlinknode p=this.head.next; while (p!=head & pareto(p.data)0) /寻找插入位置 p = p.next; dlinknode q = new dlinknode(element, p.prev, p); /插入在p结点之前 p.prev.next = q; p.prev = q; return true; public boolean remove(e element) /删除指定对象 /若操作成功返回true,o(n) if (elemen

36、t=null | !(element instanceof comparable) return false; comparable cmp = (comparable)element; dlinknode p=this.head.next; while (p!=head & pareto(p.data)0) /定位到待删除的结点 p = p.next; if (p!=head) p.prev.next = p.next; /删除p结点自己 p.next.prev = p.prev; return true; return false; /未找到指定结点,删除不成功 public static

37、 void main(string args) sortedchdlinkedlist list = new sortedchdlinkedlist(); int n=10; system.out.print(insert: ); for (int i=0; in; i+) int k = (int) (math.random()*100); if (list.add(new integer(k) system.out.print(k+ ); system.out.println(nlist: +list.tostring(); 程序运行结果如下:insert: 53 1 92 84 24 3

38、 2 73 99 99 list: (1, 2, 3, 24, 53, 73, 84, 92, 99, 99)第3章 栈和队列【习3.1】 习3-5 栈和队列有何异同?栈和队列都是特殊的线性表,两者的区别在于:栈的插入和删除操作只允许在线性表的一端进行,而队列的插入和删除操作则分别在线性表的两端进行。【习3.2】 能否将栈声明为继承线性表,入栈方法是add(0,e),出栈方法是remove(0)?为什么?不行。栈不支持中间插入和删除操作。【习3.3】 能否用一个线性表作为栈的成员变量,入栈方法是add(0,e),出栈方法是remove(0)?为什么?不行。【习3.4】 能否将队列声明为继承线性表,入队方法是add(e),出队方法是remove(0)?为什么?不行。队列不支持中间插入和删除操作。第4章 串【习4.1】 实验4.6 找出两个字符串中所有共同的字符。public class samechar public s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论