《数据结构Java版第2版》习题解答.docx
- 文档编号:10249411
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:46
- 大小:169.75KB
《数据结构Java版第2版》习题解答.docx
《《数据结构Java版第2版》习题解答.docx》由会员分享,可在线阅读,更多相关《《数据结构Java版第2版》习题解答.docx(46页珍藏版)》请在冰豆网上搜索。
《数据结构Java版第2版》习题解答
数据结构(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的数据结构声明。
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
【习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】后根次序遍历中序线索二叉树。
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
图2.1p.next=p将改变结点间的链接关系5
图4.1目标串"abbaba"和模式串"aba"的KMP算法模式匹配过程18
图4.2目标串"ababaab"和模式串"aab"的KMP算法模式匹配过程19
图6.13个结点树和二叉树的形态21
图6.2单支二叉树21
图9.2归并两条排序的单链表33
表4.1模式串"aab"的next数组19
第1章Java程序设计基础
【习1.1】实验0.1哥德巴赫猜想。
【习1.2】实验0.2杨辉三角形。
【习1.3】实验0.3金额的中文大写形式。
【习1.4】实验0.4下标和相等的数字方阵。
输出下列方阵(当n=4时)。
1267或13410
3581325911
491214681215
101115167131416
采用二维数组实现。
二维数组中,每一条斜线上各元素下标和相等,如图0.1所示。
图1.2下标和相等的数字方阵算法描述
程序如下。
publicclassUpmat
{
publicstaticvoidmain(Stringargs[])
{
intn=4;//阶数
int[][]mat=newint[n][n];
intk=1;//k是自然数,递增变化
booleanup=true;//方向向上
for(intsum=0;sum { if(up) for(inti=sum;i>=0;i--) mat[i][sum-i]=k++;//k先赋值后自加 else for(inti=0;i<=sum;i++) mat[i][sum-i]=k++; up=! up;//方向求反 } for(intsum=n;sum<2*n-1;sum++)//右下三角 { if(up) for(intj=sum-n+1;j mat[sum-j][j]=k++; else for(intj=n-1;j>sum-n;j--) mat[sum-j][j]=k++; up=! up; } for(inti=0;i { for(intj=0;j System.out.print(""+mat[i][j]); System.out.println(); } } } 【习1.1】实验0.5找出一个二维数组的鞍点 【习1.2】实验0.6复数类。 【习1.3】实验0.8图形接口与实现图形接口的类 第2章 绪论 【习2.1】实验1.1判断数组元素是否已按升序排序。 程序见例1.4的SortedArray.java。 publicstaticbooleanisSorted(int[]table)//判断整数数组是否已按升序排序 {//若已排序返回true,否则返回false if(table==null) returnfalse; for(inti=0;i if(table[i]>table[i+1]) returnfalse; returntrue; } publicstaticbooleanisSorted(Comparable[]table)//判断对象数组是否已按升序排序 {//若已排序返回true,否则返回false if(table==null) returnfalse; for(inti=0;i if(table[i].compareTo(table[i+1])>0) returnfalse; returntrue; } 【习2.2】实验1.3用递归算法求两个整数的最大公因数。 publicclassGcd { publicstaticintgcd(inta,intb)//返回a,b的最大公因数,递归方法 { if(b==0) returna; if(a<0) returngcd(-a,b); if(b<0) returngcd(a,-b); returngcd(b,a%b); } publicstaticvoidmain(Stringargs[]) { inta=12,b=18,c=24; System.out.println("gcd("+a+","+b+","+c+")="+gcd(gcd(a,b),c));//获得3个整数最大公因数 } } 第3章 线性表 【习3.1】习2-5图2.19的数据结构声明。 table数组元素为单链表,声明如下: SinglyLinkedList 【习3.2】习2-6如果在遍历单链表时,将p=p.next语句写成p.next=p,结果会怎样? 使p.next指向p结点自己,改变了结点间的链接关系,丢失后继结点,如图2.1所示。 图3.2p.next=p将改变结点间的链接关系 【习3.1】实验2.2由指定数组中的多个对象构造单链表。 在SinglyLinkedList单链表类中,增加构造方法如下。 publicSinglyLinkedList(E[]element)//由指定数组中的多个对象构造单链表 { this.head=null; if(element! =null&&element.length>0) { this.head=newNode(element[0]); Node inti=1; while(i { rear.next=newNode(element[i++]); rear=rear.next; } } } 【习3.2】实验2.2单链表的查找、包含、删除操作详见8.2.1。 单链表的以下查找、包含、删除等操作方法详见8.2.1顺序查找。 publicNode publicNode publicbooleancontain(Eelement)//以查找结果判断单链表是否包含指定对象 publicbooleanremove(Eelement)//移去首次出现的指定对象 【习3.3】实验2.2单链表的替换操作。 在SinglyLinkedList单链表类中,增加替换操作方法如下。 publicbooleanreplace(Objectobj,Eelement)//将元素值为obj的结点值替换为element {//若替换成功返回true,否则返回false,O(n) if(obj==null||element==null) returnfalse; Node while(p! =null) { if(obj.equals(p.data)) { p.data=element; returntrue; } p=p.next; } returnfalse; } 【习3.4】实验2.2首尾相接地连接两条单链表。 在SinglyLinkedList单链表类中,增加替换操作方法如下。 publicvoidconcat(SinglyLinkedListlist)//将指定单链表list链接在当前单链表之后 { if(this.head==null) this.head=list.head; else { Node while(p.next! =null) p=p.next; p.next=list.head; } } 【习3.5】实验2.2复制单链表。 在SinglyLinkedList单链表类中,增加构造方法如下。 publicSinglyLinkedList(SinglyLinkedList {//复制单链表 this.head=null; if(list! =null&&list.head! =null) { this.head=newNode(list.head.data); Node Node while(p! =null) { rear.next=newNode rear=rear.next; p=p.next; } } } 【习3.6】实验2.2单链表构造、复制、比较等操作的递归方法。 由指定数组中的多个对象构造单链表的操作也可设计为以下的递归方法: publicSinglyLinkedList(E[]element)//由指定数组中的多个对象构造单链表 { this.head=null; if(element! =null) this.head=create(element,0); } privateNode { Node if(i { p=newNode(element[i]); p.next=create(element,i+1); } returnp; } 单链表的复制操作也可设计为以下的递归方法: publicSinglyLinkedList(SinglyLinkedList { this.head=copy(list.head); } privateNode { Node if(p! =null) { q=newNode(p.data); q.next=copy(p.next); } returnq; } 比较两条单链表是否相等的操作也可设计为以下的递归方法: publicbooleanequals(Objectobj)//比较两条单链表是否相等 { if(obj==this) returntrue; if(objinstanceofSinglyLinkedList) { SinglyLinkedListlist=(SinglyLinkedList)obj; returnequals(this.head,list.head); } returnfalse; } privatebooleanequals(Node { if(p==null&&q==null) returntrue; if(p! =null&&q! =null) returnp.data.equals(q.data)&&equals(p.next,q.next); returnfalse; } 【习3.7】建立按升序排序的单链表(不带头结点)。 采用直接插入排序算法将一个结点插入到已排序的单链表中。 importdataStructure.linearList.Node; importdataStructure.linearList.SinglyLinkedList;//不带头结点的单链表类 publicclassSortedSinglyLinkedList { publicSortedSinglyLinkedList() { super(); } publicbooleanadd(Eelement)//根据指定对象的大小插入在合适位置 { if(element==null||! (elementinstanceofComparable)) returnfalse;//不能插入null或非Comparable对象 Comparablecmp=(Comparable)element; if(this.head==null||pareTo(this.head.data)<=0) this.head=newNode else { Node while(p! =null&&pareTo(p.data)>0) { front=p;//front是p的前驱结点 p=p.next; } front.next=newNode } returntrue; } publicstaticvoidmain(Stringargs[]) { SortedSinglyLinkedList intn=10; System.out.print("insert: "); for(inti=0;i { intk=(int)(Math.random()*100);//产生随机数 if(list.add(newInteger(k))) System.out.print(k+""); } System.out.println("\nlist: "+list.toString()); } } 程序多次运行结果如下: insert: 2248509717119675080 list: (9,19,22,48,50,50,67,71,71,80) insert: 42335289131150297834 list: (11,13,29,33,34,42,50,52,78,89) insert: 6916990206814739076 list1: (0,14,16,20,68,69,73,76,90,99) 【习3.8】实验2.6带头结点的循环双链表类,实现线性表接口。 packagedataStructure.linearList; importdataStructure.linearList.DLinkNode;//导入双链表结点类 importdataStructure.linearList.LList;//导入线性表接口 publicclassCHDoublyLinkedList { protectedDLinkNode publicCHDoublyLinkedList()//构造空链表 { this.head=newDLinkNode this.head.prev=head; this.head.next=head; } publicbooleanisEmpty()//判断双链表是否为空 { returnhead.next==head; } //以下算法同循环单链表,与单链表的差别在于,循环条件不同 publicintlength()//返回双链表长度 { inti=0; DLinkNode while(p! =head)//循环条件与单链表不同 { i++; p=p.next; } returni; } publicEget(intindex)//返回序号为index的对象 { if(index>=0) { intj=0; DLinkNode while(p! =head&&j { j++; p=p.next; } if(p! =head) return(E)p.data; } returnnull; } publicEset(intindex,Eelement)//设置index序号对象为element { if(index>=0&&element! =null) { intj=0; DLinkNode while(p! =head&&j { j++; p=p.next; } if(p! =head) { Eold=(E)p.data; p.data=element; returnold; } } returnnull; } publicStringtoString() { Stringstr="("; DLinkNode while(p! =head) { str+=p.data.toString(); p=p.next; if(p! =head) str+=","; } returnstr+")"; } //双链表的插入、删除算法与单链表不同 publicbooleanadd(intindex,Eelem
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构Java版第2版 数据结构 Java 习题 解答