1、 在链队列中,即使不设置尾指针也能进行入队操作。
分析:使用不设置尾指针的链表作为链队列的存储结构,在进行入队操作的时候需要遍历整个链队列至队尾,然后再进行插入。这是可行的,但是效率下降。
如果只使用一个指针又要保持效率的话,可以使用只带尾指针的循环单链表作为存储结构,这样出队和入队的开销都是O(1).
2、 设循环队列存储空间Q(1:35),初始状态为front = rear =35.现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数:0 or 35
分析:循环队列是将队列首尾相连而成。
第一种情况:
循环队列元素个数:n=(rear – front+MAXSIZE)modMAXSIZE,
其中rear表示队尾,front表示队首,MAXSIZE表示队列最大容量,mod表示取余。带入数据得 n=0;
第二种情况:
队列是从队头删除元素,队头指针追赶队尾指针,从队尾增加元素时,队尾指针追赶队头指针,存在队满时,头尾指针相等的情况,即为35.
3、 循环队列也存在空间溢出问题。
分析:循环队列解决的是“假溢出”问题,但是仍然出现真正的溢出问题。假溢出指的是下标溢出,真溢出指的是空间溢出。
循环队列面临着数组可能溢出的问题。
4、 循环队列存储在数组A[0,1,……m],则入队时的操作为:rear=(rear+1)mod(m+1)
5、 解析XML时,需要检验节点是否闭合,如必须有与之对应,用栈数据结构实现比较好。
分析:栈是解决封闭对应问题的有效方法。
比如在解析XML中,遇到一个<demo>左标签就入栈,遇到其子标签的左标签同样入栈。遇到右标签(或者子标签的右标签)就检验栈顶元素是否与该右标签对应,能对应就出栈,不能对应则说明标签不对称,是无效的XML文件。
栈的应用:符号匹配,表达式求值,实现函数调用
栈的应用:
递归(存放局部变量,返回地址等,不过该栈是操作系统提供的栈)、
快速排序(非递归程序用栈实现):栈中存放要进行一遍快排的起始位置,利用栈先进后出的方式,模拟递归的过程。
表达式求值:将中序表达式转换成前序或者后序,需要用栈存放符号。
树的深度优先遍历,用栈记录遍历过的元素,以便进行回溯。
6、 便于插入和删除的容器:list、map、set
分析:list(底层数据结构为双向链表,支持快速增删)、
map 、set(都是STL关联容器,支持快速增删)
vector(底层数据结构为数组,支持快速随机访问)
7、 全局变量和静态变量存于全局区/静态区;
局部变量存于栈区;
new的对象存于堆区;
malloc的对象存于堆区;
常量存于常量区;
8、 递归先序遍历一个n节点,深度为d的二叉树,需要栈空间的大小为:O(d)
分析:因为二叉树不一定是平衡的,也就是深度d!=log n,有可能d>>log n。所以栈的大小应该是O(d)
在从根向下遍历中,每次先转移到左子树上,而右边则需要暂存起来,因此需要的暂存空间需要d个。
二叉树深度d满足:log n <= d <=n
完全二叉树深度d=log N+1,题目未说明是否为完全二叉树。
9、 堆栈溢出一般是因为:
循环的递归调用(涉及到压栈入栈)、
大数据结构的局部变量(局部变量存储在栈区)