队列学习(2)

来源:互联网 发布:java多线程售票系统 编辑:程序博客网 时间:2024/06/06 00:31

1、       在链队列中,即使不设置尾指针也能进行入队操作。

分析:使用不设置尾指针的链表作为链队列的存储结构,在进行入队操作的时候需要遍历整个链队列至队尾,然后再进行插入。这是可行的,但是效率下降。

如果只使用一个指针又要保持效率的话,可以使用只带尾指针的循环单链表作为存储结构,这样出队和入队的开销都是O(1).

2、       设循环队列存储空间Q1:35),初始状态为front = rear =35.现经过一系列入队与退队运算后,front=15rear=15,则循环队列中的元素个数:0 or 35

分析:循环队列是将队列首尾相连而成。

第一种情况:

循环队列元素个数:n=(rear – front+MAXSIZE)modMAXSIZE

其中rear表示队尾,front表示队首,MAXSIZE表示队列最大容量,mod表示取余。带入数据得 n=0

第二种情况:

队列是从队头删除元素,队头指针追赶队尾指针,从队尾增加元素时,队尾指针追赶队头指针,存在队满时,头尾指针相等的情况,即为35.

 

3、       循环队列也存在空间溢出问题。

分析:循环队列解决的是“假溢出”问题,但是仍然出现真正的溢出问题。假溢出指的是下标溢出,真溢出指的是空间溢出。

循环队列面临着数组可能溢出的问题。

 

4、       循环队列存储在数组A[01,……m],则入队时的操作为:rear=rear+1modm+1

5、       解析XML时,需要检验节点是否闭合,如必须有与之对应,用栈数据结构实现比较好。

分析:栈是解决封闭对应问题的有效方法。

比如在解析XML中,遇到一个<demo>左标签就入栈,遇到其子标签的左标签同样入栈。遇到右标签(或者子标签的右标签)就检验栈顶元素是否与该右标签对应,能对应就出栈,不能对应则说明标签不对称,是无效的XML文件。

     

栈的应用:符号匹配,表达式求值,实现函数调用

栈的应用:

递归(存放局部变量,返回地址等,不过该栈是操作系统提供的栈)、

快速排序(非递归程序用栈实现):栈中存放要进行一遍快排的起始位置,利用栈先进后出的方式,模拟递归的过程。

表达式求值:将中序表达式转换成前序或者后序,需要用栈存放符号。

树的深度优先遍历,用栈记录遍历过的元素,以便进行回溯。

 

6、       便于插入和删除的容器:listmapset

分析: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、       堆栈溢出一般是因为:

循环的递归调用(涉及到压栈入栈)、

大数据结构的局部变量(局部变量存储在栈区)

0 0
原创粉丝点击