class ArrayQueue(Queuebase):
    """数组队列"""
    def __init__(self, capacity=10):
        self._array = Array(capacity)

    def enqueue(self, e):
        """入队"""
        self._array.add_Last(e)

    def dequeue(self):
        """出队"""
        return self._array.remove_First()

    def get_Front(self):
        """获得队首元素"""
        return self._array.get_First()

    def get_Size(self):
        """获得队列内元素数量"""
        return self._array.get_Size()

    def is_Empty(self):
        """查看队列是否为空"""
        return self._array.is_Empty()

    def get_Capacity(self):
        """查看队列的容量"""
        return self._array.get_Capacity()

    def __str__(self):
        StringList = []
        StringList.append("Queue:size = %s, capacity = %d \n" %
                          (self.get_Size(), self.get_Capacity()))
        StringList.append('front [')
        for i in range(self.get_Size()):
            StringList.append("%s" % self._array.get(i))
            if i != self.get_Size() - 1:
                StringList.append(",")
        StringList.append('] tail')
        return "".join(StringList)
Example #2
0
class ArrayStack(Stackbase):
    def __init__(self, capacity=0):
        """默认capacity为0"""
        self._array = Array(capacity)

    def push(self, e):
        """向栈中添加元素"""
        self._array.add_Last(e)

    def pop(self):
        """从栈中取出元素"""
        return self._array.remove_Last()

    def peek(self):
        """获得栈顶元素"""
        return self._array.get_Last()

    def get_Size(self):
        """获得栈中元素数量"""
        return self._array.get_Size()

    def is_Empty(self):
        """栈是否为空"""
        return self._array.is_Empty()

    def get_capacity(self):
        return self._array.get_Capacity()

    def __str__(self):
        StringList = []
        StringList.append("Stack:size = %s, capacity = %d \n" %
                          (self._array.get_Size(), self._array.get_Capacity()))
        StringList.append('[')
        for i in range(self._array.get_Size()):
            StringList.append("%s" % self._array.get(i))
            if i != self._array.get_Size() - 1:
                StringList.append(",")
        StringList.append('] top')
        return "".join(StringList)
class MaxHeap:
    def __init__(self, arr=None, capacity=None):
        if isinstance(arr, Array):
            self._data = arr
            # heapify
            for i in range(self._parent(arr.get_Size() - 1), -1, -1):
                self._sift_down(i)
            return
        if not capacity:
            self._data = Array()
        else:
            self._data = Array(capacity)

    def size(self):
        """返回堆中元素的个数"""
        return self._data.get_Size()

    def is_Empty(self):
        """返回布尔值,表示堆中是否为空"""
        return self._data.is_Empty()

    def _parent(self, index):
        """返回完全二叉树的数组表示中,一个索引所表示的元素的父节点的索引"""
        if index == 0:
            raise ValueError("index-0 doesn't have parent.")
        return (index - 1) // 2

    def _left_child(self, index):
        """返回该索引对应元素的左孩子的索引"""
        return index * 2 + 1

    def _right_child(self, index):
        """返回该索引对应元素的右孩子的索引"""
        return index * 2 + 2

    def add(self, e):
        """向堆中添加元素"""
        self._data.add_Last(e)  # 添加
        self._sift_up(self._data.get_Size() - 1)  # 上浮

    def _sift_up(self, k):
        """上浮,为满足堆的大小性质"""
        while k > 0 and self._data.get(self._parent(k)) < self._data.get(k):
            # 不可以是根节点元素(没有父节点) & 父节点元素小于该节点元素
            self._data.swap(k, self._parent(k))
            k = self._parent(k)

    def _find_max(self):
        """查找堆中的最大元素"""
        if not self._data.get_Size():
            raise ValueError("Can not find max when heap is empty.")
        return self._data.get(0)

    def _extract_max(self):
        """取出堆中的最大元素"""
        ret = self._find_max()
        self._data.swap(0, self._data.get_Size() - 1)  #末尾元素与最大值交换位置
        self._data.remove_Last()  #删除在末尾的最大值
        self._sift_down(0)
        return ret

    def _sift_down(self, k):
        """下移,为满足堆的大小性质"""
        while self._left_child(k) < self._data.get_Size():
            j = self._left_child(k)
            if j + 1 < self._data.get_Size() and self._data.get(
                    j + 1) > self._data.get(j):
                # 判断是否存在右孩子,然后判断右孩子是否大于左孩子
                # data[j]是左孩子和右孩子中的最大值
                j = self._right_child(k)
            if self._data.get(k) >= self._data.get(j):  #不大于
                break
            self._data.swap(k, j)
            k = j

    def replace(self, e):
        """取出堆中的最大元素,并且替换成元素e"""
        ret = self._find_max()
        self._data.set(0, e)  #替换
        self._sift_down(0)  #下移
        return ret