标签:tostring 进度条 语言 分享图片 插入 删除 快速 考试 efficient
问题1解决方案:数组和链表在一定程度上都可以表示栈的push、pop、peek等方法,但是数组有容量需要确定的长度大小,而链表没有容量限制。数组利用索引能提供对元素的直接访问,而链表必须依次遍历元素才能到达其中的某个结点。通过课后的编程项目以及网上的查找可以看出两者有不同的优缺点:
- 数组
- 优点:随机访问性强(通过索引可以快速定位)、查找速度快
- 缺点:插入和删除效率低(插入和删除需要整体移动数据)、可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存)、内存空间要求高,必须有足够的连续内存空间。数组大小固定,不能动态拓展。
- 链表
- 优点:插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)、内存利用率高,不会浪费内存(可以使用内存中细小的不连续空间,并且在需要空间的时候才创建空间)、大小没有固定,拓展很灵活。
- 缺点:不能随机查找,每次查找必须从第一个开始遍历,查找效率低。
可以看出,链表的优点就是数组的缺点。对于替代栈的方法在代码中遇到的问题中会具体说明。
问题2解决方案:单向链表的每个结点有一个next引用指向链表的后续结点,双向链表的每个结点存储着一个next引用和一个previous引用。双向链表的双向引用可以使两
端既为头又为尾,适用于复杂的集合排列。
问题3解决方案:有哨兵结点的对于具体方法的使用可以简便,但需要额外的一个结点。
- 带哨兵节点的链表,需要额外的一个节点,但插入和删除等操作不需要额外的判断;不带哨兵节点,在处理链表为空时,和其他情况不一样,需要单独判断一次。
- 带哨兵节点的链表,插入或删除时,不论操作的位置,表头都不变,不需要额外的判断;不带哨兵节点的链表,插入或删除操作发生在第一个节点时,表头指针都要变化,需要额外的处理。
问题2的解决方案:
- push:添加一个元素到栈的一端
- 数组:先判断数组是否已满,未满的情况下可以直接插在下一个可用位置,满的条件下可以进行扩容,在插入可用位置即可。
- 链表:创建新结点,含有一个引用,指向要放置到栈中的对象。把原链表末尾的结点指向新元素,新结点的next引用设置为指向当前栈顶。
- pop:从栈的前端移出一个元素
- 数组:在确保栈中至少有一个元素的前提下返回索引值为存入内容的数组空间数 - 1(索引值从0开始)的元素,令其等于null。
- 链表:在确保栈中至少有一个元素的前提下进行循环(通过
next == null
的条件)找到链表尾部元素,在倒数第二个元素的结点上令其next == null
即可。
- peek:返回一个指向栈的前端元素的引用
- 数组:返回索引值为存入内容的数组空间数 - 1(索引值从0开始)的元素。
- 链表:进行循环(通过
next == null
的条件)找到链表尾部元素进行输出。- peek与pop的区别就是在于对栈顶元素的查看和移除。
- isEmpty:如果栈为空返回真,否则返回假
- 数组:判断索引值为0的位置是否为空,或是判断栈的元素计数器top变量是否为0。
- 链表:判断链表的头位置是否为空,或是判断栈的元素计数器count变量是否为0。
- toString:
- 数组:从索引值最大的位置开始不断缩减索引值并进行输出。
- 链表:从链表的尾部开始往头部进行不断输出。
- 直接用Stack.toString()就是从栈底往栈顶输出,而不是从栈顶往栈底输出,所以我用数组和链表替代栈的时候都改为从栈顶到栈底。
I love you !
就应该是! uoy evol I
而3.8的要求是针对集合中的每一个元素{one,two,three}
就应该是{three,two,one}
。3.2用了charAt()方法,3.8StringTokenizer方法。在实现的基础上我用了上学期的一个示例代码,加了一个循环。(3.8我觉得元素集之间的间隔符号不一定是空格或是逗号,所以我采用可以使任意一个符号都可以。)
本周结对学习情况
20172314方艺雯
20172323王禹涵
结对学习内容:数组和链表来替代栈
终于开始编写项目了,好恐怖!!!还有课堂测试,好在第三章和第四章讲述的都是自己熟悉的内容,还有上学期的代码的加持,还是很顺利的度过了。整体来看第三章和第四章的内容,无论是用数组表示栈,还是用链表表示栈都是理解数组和链表的操作就好。相对比,自己的链表还不是像数组一样应用自如,还是要在链表的相关知识点进行理解!!在考试的部分又看到和上学期一样的不足,需要有道的帮助,本学期还有可怕的四级考试,看来我的英语之路,任重而道远了。加油,下周又是元气满满的一周(? ??_??)?!
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 15/15 | |
第二周 | 703/703 | 1/2 | 20/35 |
20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
标签:tostring 进度条 语言 分享图片 插入 删除 快速 考试 efficient
原文地址:https://www.cnblogs.com/sanjinge/p/9651945.html