栈学习(2)

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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值