赞
踩
Exercise 10.1-2
我们将栈命名为T和R。首先,设置T.top = 0和R.top = n + 1。实际上,栈T使用数组的第一部分,栈R使用数组的最后一部分。在栈T中,top是T中最右边的元素。在栈R中,top是R中最左边的元素。
Exercise 10.1-3
Exercise 10.1-4
Exercise 10.1-5
在本节给出的示例代码中,我们将忽略检查溢出和下溢错误。
Exercise 10.1-6
enqueue操作与将一个元素压入栈1的操作相同。这个操作是O(1)。要脱离队列,从栈2取出一个元素。如果栈2是空的,对于栈1中的每个元素,我们取出它,然后将它压入栈2。最后,从栈2中取出最上面的项。在最坏的情况下,这个操作是O(n)。
Exercise 10.1-7
下面是一种使用两个队列实现堆栈的方法,其中pop需要线性时间,push需要常数时间。第一种方法是在推入每个元素时将其排队。然后,要执行弹出操作,需要从一个队列中取出每个元素,并将其放置在另一个队列中,但在最后一个元素之前停止。然后,返回原始队列中剩下的单个元素。
要在常量时间内插入一个元素,只需将其添加到头部,使其指向旧的头部,并使其成为头部。要删除一个元素,需要线性时间,因为如果不从头开始扫描,就无法获得指向列表中前一个元素的指针。
Exercise 10.2-2
PUSH(L,x)操作与LIST-INSERT(L,x)完全相同。POP操作设置x等于L.head,调用LIST-DELETE(L,L.head),然后返回x。
Exercise 10.2-3
除了表头,还要保留一个指向链表最后一个元素的指针。要排队,请在列表的最后一个元素之后插入元素,并将其设置为新的最后一个元素。要退出队列,请删除列表的第一个元素并返回它。
Exercise 10.2-4
首先让L.nil.key = k,然后像往常一样运行LIST-SEARCH ',但是去掉的检查。
Exercise 10.2-5
要插入,只需在常量时间内,在当前头之前插入列表。要搜索,从头部开始,检查元素是否为正在检查的当前节点,检查下一个元素,依此类推,直到列表末尾或找到元素。在最坏的情况下,这可能需要线性时间。要删除,再次使用线性时间,因为没有办法立即到达该元素
在当前元素之前,而不是从头部开始并沿着列表。
Exercise 10.2-6
设L1是包含S1元素的双链表,L2是包含S2元素的双链表。我们实现UNION的方式如下:设置L1.nil.prev.next = L2.nil.next和L2.nil.next.prev = L1.nil.prev,使得L1的最后一个元素紧跟着L2的第一个元素。然后设置l1.nil.prev = L2.nil.prev.和L2.nil.prev.next = L1.nil,所以L1.nil是包含L1和L2中所有元素的双链表的哨兵。
Exercise 10.2-7
Exercise 10.2-8
为了方便,我们将单独存储L.head的指针值。一般来说,A XOR (A XOR C) = C,所以一旦我们知道了一个指针的true值,就可以通过应用该规则恢复所有其他指针(即L.head)。假设列表中至少有两个元素,第一个元素将包含第二个元素的精确地址。
要反转列表,我们只需要将头元素作为L.nil之前的“最后”元素,而不是在此之后的第一个元素。这可以通过设置L.head =L.nil.np XOR L.head来实现。
多数组版本可以是L = 2,
一个数组的版本可以是L = 4,
Exercise 10.3-2
Exercise 10.3-3
分配Allocate对象只返回一些单元格的索引,它保证在它们被释放之前不会再给出索引。prev属性不会被修改,因为内存管理器只使用next属性,这取决于调用allocate的代码是否使用它认为合适的prev和key属性。
Exercise 10.3-4
对于ALLOCATE-OBJECT,我们将跟踪数组中下一个可用的位置,并且它总是比存储的元素数量大1。对于FREE-OBJECT(x),当释放一个空间时,将大于x的每个元素的位置减1,并相应地更新指针。这需要线性时间。
Exercise 10.3-5
参见算法COMPACTIFY−LIST(L, F)
注意,数组中的索引8和2没有出现,而且实际上并不表示有效的树。
Exercise 10.4-2
参见算法PRINT-TREE。
Exercise 10.4-3
Exercise 10.4-4
参见算法PRINT-TREE。
Exercise 10.4-5
参见INORDER-PRINT ' (T)算法。
Exercise 10.4-6
我们的两个指针分别是左和右。对于节点x, x. left将指向x最左边的子节点,如果x有兄弟节点,则x.right将指向紧邻其右侧的兄弟节点,否则则指向x的父节点。我们的布尔值b,存储在x处,b = depth(x) mod 2。要到达节点的父节点,只需一直跟随“右”指针,直到布尔值的奇偶校验发生变化。要查找节点的所有子节点,首先查找x. left,然后跟踪“右”指针,直到布尔值的奇偶校验发生变化,忽略最后一个节点,因为它将是x。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。