代码见一个数组实现两个栈TwoStacksInOneArray
10.1-3 用图示说明队列操作过程ENQUEUE(Q, 4), ENQUEUE(Q, 1), ENQUEUE(Q, 3), DEQUEUE(Q), ENQUEUE(Q, 8), and DEQUEUE(Q) in array Q[1..6].
代码见Queue
代码见Queue_By2Stacks
入队时间O(1)。
出队时,如果出队元素在stack2(stack2不为空),直接stack2.pop,O(1)。否则,stack1要把所有元素先弹栈再依次入stack2,然后stack2.pop,O(n)。
代码见Stack_By2Queue
入队时间O(1)。
出队时,每次都要把一个队列的数除了队尾的都重新插入另外一个队列。时间复杂度O(n-1)。
插入能,删除不能。
代码见Queue_ByLinkedList
需要注意的是,要实现O(1)级别的dequeue,需要LinkedList提供O(1)的removeLast()方法。
O(1)的removeLast()在我的LinkedList类里已实现。
代码见LinkedList_Sorted
时间复杂度,如果插入、查找、删除的元素不在字典区间内,则O(1)。否则O(n)。
假设数组能容纳10个元素。见下图(元素在数组中方的位置我是随机选的)
代码见ObjectImplBySingleArray
数组实现的链表操作,和普通的链表操作时间复杂度一样,插入是O(1),查找和删除都是最坏O(n)。
书上的实现中确实没有对prev的重置,但是我自己的实现中还是重置了prev的。 可能是不需要prev操作吧。
假设链表以外没有指向链表元素的指针,请说明如何实现过程ALLOCATE_OBJECT和FREE_OBJECT,才能使这种表比较紧凑。(提示:使用栈的数组实现)
思路是,增加的时候总是往数组能用的最小下标增加(类似stack push);
删除时,如果删除的是最大的数组下标,啥也不用动;如果不是,删除后,可以把最大数组下表的元素移动到被删除空出来的数组位置。这涉及到一些指针的操作而已。
代码见Tree_LefrChildRightSibling
实现了先根遍历,中根遍历,后根遍历和层次遍历。注意怎么快速建立一棵树的。