大话数据结构第四章栈十个问题及解答
1.什么是栈?它有什么特点?
栈是限定仅在表尾进行插入和插入和删除的线性表。
特殊之处在于限制了这个线性表的插入和删除位置,它始终只在栈顶进行,也使得栈底是固定的,最先进栈的只能在栈底。
2.两栈共享空间的定义是什么?
我们可以用一个数组来存放两个栈。数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈底为数组的末端,即下标为数组长度n-1处。这样,两个栈如果增加元素,就是两端点向中间延伸。
3.两栈共享空间什么时候可以判定栈满?
如果top1 top2分别是栈1和栈2的栈顶指针,只需判定top1+1是否等于top2即可判定是否栈满。
4.栈的链式存储结构有什么特点?
链栈不需要头结点,基本不存在栈满的情况,除非是内存没有可以使用的空间,对于空栈,头指针指向空。
5.顺序栈和链栈的区别?
顺序栈和链栈在时间复杂度上是一样的,均为O(1)。对于空间性能,顺序栈需要事先确定一个固定的长度,可能会存在空间浪费的问题,但它的优势是存取时定位很方便,而链栈则需要每个元素都有指针域,这同时也增加了内存开销,但对于栈的长度无限制。
6.什么是用顺序栈?什么时候用炼栈?
如果栈的使用过程中元素变化不可预料,有时很小,优势非常大,那么最好用炼栈。反之,如果变化范围在可控范围内,建议使用顺序栈好一些。
7.栈的作用?
栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。栈还有一个很重要的应用:在程序设计语言中实现了递归。
8.递归的定义?
在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。
9.递归定义至少需要什么条件?
每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。
10.递归和迭代的区别?
迭代使用的是循环结构,递归使用的是选择结构。递归能使程序的结果更加的清晰,更简洁,更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的实践和内存。迭代则不需要反复调用函数和占用额外的内存。
1.什么是栈?它有什么特点?
栈是限定仅在表尾进行插入和插入和删除的线性表。
特殊之处在于限制了这个线性表的插入和删除位置,它始终只在栈顶进行,也使得栈底是固定的,最先进栈的只能在栈底。
2.两栈共享空间的定义是什么?
我们可以用一个数组来存放两个栈。数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈底为数组的末端,即下标为数组长度n-1处。这样,两个栈如果增加元素,就是两端点向中间延伸。
3.两栈共享空间什么时候可以判定栈满?
如果top1 top2分别是栈1和栈2的栈顶指针,只需判定top1+1是否等于top2即可判定是否栈满。
4.栈的链式存储结构有什么特点?
链栈不需要头结点,基本不存在栈满的情况,除非是内存没有可以使用的空间,对于空栈,头指针指向空。
5.顺序栈和链栈的区别?
顺序栈和链栈在时间复杂度上是一样的,均为O(1)。对于空间性能,顺序栈需要事先确定一个固定的长度,可能会存在空间浪费的问题,但它的优势是存取时定位很方便,而链栈则需要每个元素都有指针域,这同时也增加了内存开销,但对于栈的长度无限制。
6.什么是用顺序栈?什么时候用炼栈?
如果栈的使用过程中元素变化不可预料,有时很小,优势非常大,那么最好用炼栈。反之,如果变化范围在可控范围内,建议使用顺序栈好一些。
7.栈的作用?
栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。栈还有一个很重要的应用:在程序设计语言中实现了递归。
8.递归的定义?
在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。
9.递归定义至少需要什么条件?
每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。
10.递归和迭代的区别?
迭代使用的是循环结构,递归使用的是选择结构。递归能使程序的结果更加的清晰,更简洁,更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的实践和内存。迭代则不需要反复调用函数和占用额外的内存。