1. 若栈采用顺序存储方式存储,现两栈共享空间v[1……m],top[i]代表第i个栈(i=1,2)栈顶,栈1的底在v[1],栈2的底在v[m],则栈满的条件是(B)
B top[1]+1=top[2]
分析:
m1和m2如果不相邻,那么要么S[1]还可以允许元素入栈,要么S[2]允许。只有m1 + 1 = m2时,没有多余的空间允许更多元素入栈,此时栈满。
顺序存储方式,栈一从下往上,栈二从上往下,正好接上的时候栈满。因此top[1]+1等于top[2]时栈满。
2. 递归过程或函数调用时,处理参数及返回地址,要用一种称为栈的数据结构。
3. 任何二叉树的后序线索树进行后序遍历时都必须用栈。
(错误。线索二叉树的结点增加了指向前驱结点和指向后继结点的标识,因此在遍历时无需要栈。)
一般情况下,二叉树的后序线索树是需要额外用到栈的。虽然每个节点都带有前驱和后续指针,但若前驱和后续指针都被占用,那么只能用栈。只有左半边或者只有右半边的二叉树遍历也需要分情况的。只有左半边的二叉树,用后序遍历不用栈,只有右半边还是要栈。只有右半边的二叉树前序遍历不要栈,只有左半边的还是要栈。
线索二叉树:
n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。
4. 递归先序遍历一个n节点,深度为d的二叉树,需要栈空间的大小为O(d)
分析:因为二叉树不一定是平衡的,也就是说深度d!=log n.有可能d>>log n,所以栈大小为O(d)。
二叉树深度d满足:logn<=d<=n;所以需要栈空间为O(d)。
5. 二叉排序树中,查找的平均时间复杂度是O(logn);
对于栈和队列来说,查找就意味着把元素挨个出栈或者出队,故平均时间复杂度是O(n);
而哈希表,直接通过关键码查找元素,平均为O(1);
故哈希表速度是最快的。
5. 一个栈的入栈序列为1,2,3……n,其出栈序列为p1,p2……pn。则p2=3,则p3的可能取值个数是:n-1.
分析:首先,栈的先进后出原则大家应该是知道的。
根据题意 p 2 = 3,可以知道 p 1 的可能情况有三种:1,2或 4。(看到有些人只想到了 1,2)
为啥这样想呢?这里估计还有一个关键是要考虑到 n 的大小。
当 n = 3 时, p 2 = 3 的话,那么 p 1 有两种情况 1 和 2 。
如果 p 1 = 1 ,那么 p 3 = 2 ;如果 p 1 = 2 ,那么 p 3 = 1 ;
此时的话我们就可以看到 p 3 只有两种可能 1 或者 2 。符合(n - 1)个。
当 n > 3 时: p 2 = 3 的话,那么 p 1 有三种情况 1 , 2 和 4 。
如果 p 1 = 1 ,那么 p 3 = 2,4,5,... n (n - 2)个如果 p 1 = 2 ,那么 p 3 = 1,4,5,... n (n - 2)个如果 p 1 = 4 ,那么 p 3 = 2,5,6,... n (n - 3)个
此时的话我们就可以看到 p 3 的情况有 1,2,4,5,... n (n - 1)个。综上所述就是 p 3 可能取值的个数是(n - 1)个。
6. 堆栈溢出的主要原因:
1) 可能由于循环的递归引起的;
2) 由于分配过大的局部变量引起;
注意:堆是堆,栈是栈,堆栈是堆栈。数组越界、没有回收内存、深层次递归调用都会导致堆栈溢出。
补充:
1、内存泄露,比如某一数组原先已定义好大小,但是在后续操作中存放的个数超出这一既定长度,会导致堆栈溢出;
2、由于程序员动态申请的内存块使用后未立即释放,导致内存区不够用,也会导致堆栈溢出;
3、程序陷入死循环,往内存写数据,不断地消耗内存空间;
4、程序本身运行起来就要消耗一定大小的内存,但是系统提供的实际内存不够,比如JVM虚拟内存不够让程序使用;
7. 下列说法错误的是(BD)
A 利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,这种形式的栈也称为顺序栈;
B top=0时为空栈,元素进栈时指针top不断减一
C 当top等于数组的最大下标值时,则栈满;
D 栈不能对输入序列部分或全局起求逆作用;
分析:A正确,虽然链栈也可以实现地址连续,但无法做到依次存放数据元素,因为除了元素域还需要存放指针域。因此满足条件的只有顺序栈。
B错误,top= -1时为空栈,top=0只能说明栈中只有一个元素,并且元素进栈时top应该自增
C正确,top所指向的对象永远是栈顶元素
D错误,栈的特性(先进后出)就决定了可以作为求逆元素的辅助空间。所谓求逆运算就是ABC依次入栈,输入CBA