美文网首页
Python实现动态数组

Python实现动态数组

作者: 0200a9609930 | 来源:发表于2019-08-28 16:37 被阅读0次

DEFAULT_CAPACITY = 5
ELEMENTS_NOT_FOUND = -1


class ArrayList:
    __size = 0

    def __init__(self, capacity=DEFAULT_CAPACITY):
        capacity = DEFAULT_CAPACITY if capacity < DEFAULT_CAPACITY else capacity
        self.__elements = [None] * capacity

    def size(self) -> int:
        return self.__size

    def is_empty(self) -> bool:
        return self.size == 0

    def contains(self, element: int) -> bool:
        return self.__index_of__(element) != ELEMENTS_NOT_FOUND

    def add(self, element: int):
        self.insert(index=self.__size, element=element)

    def get(self, index: int) -> int:
        self.__range_check__(index)
        return self.__elements[index]

    '''
    用新的element替换角标为index的元素
    '''
    def set(self, index: int, element: int) -> int:
        self.__range_check__(index)
        self.__elements[index] = element
        return 0

    # 插入
    def insert(self, index: int, element: int):
        self.__range_check_for_add__(index)

        self.__ensure_capacity__(self.__size + 1)

        for i in range(self.__size, index, -1):
            self.__elements[i] = self.__elements[i-1]
        self.__elements[index] = element
        self.__size += 1

    def remove(self, index: int):
        self.__range_check__(index)

        for i in range(index, self.__size - 1):
            self.__elements[i] = self.__elements[i+1]
        self.__size -= 1

    def clear(self):
        self.__size = 0

    def __ensure_capacity__(self, capacity: int):
        old_capacity = len(self.__elements)
        if old_capacity >= capacity:
            return
        new_capacity = old_capacity + (old_capacity >> 1)
        new_elements = [None] * new_capacity
        for i in range(self.__size):
            new_elements[i] = self.__elements[i]
        self.__elements = new_elements

        print('%d扩容成%d' % (old_capacity, new_capacity))

    def __index_of__(self, element: int) -> int:
        for (index, element) in enumerate(self.__elements):
            if element == element:
                return index
        return ELEMENTS_NOT_FOUND

    '''
    检查下标值
    '''
    def __range_check__(self, index: int):
        if index < 0 or index >= self.__size:
            self.__out_of_bounds__()

    '''
    添加元素时, 检查下标值
    可以等于size 等于size时表示加到最后
    '''
    def __range_check_for_add__(self, index: int):
        if index < 0 or index > self.__size:
            self.__out_of_bounds__()

    def __out_of_bounds__(self):
        raise RuntimeError('out of bounds')

    def __str__(self):
        return str(self.__elements)

测试增删改查

arr = ArrayList()
arr.insert(0, 11)
arr.add(22)
arr.add(33)
arr.add(44)
arr.add(55)
print(arr)
print('-----------')

arr.insert(1, 66)
print(arr)
arr.remove(2)
print(arr)
arr.add(77)
print(arr)

print('-----------')

arr.clear()

print(arr)
arr.add(101)
arr.add(102)
print(arr)

测试扩容

arr = ArrayList()

arr.insert(0, 11)
arr.add(22)
arr.add(33)
arr.add(44)
arr.add(55)

for i in range(30):
    arr.add(i)

相关文章

  • Python实现动态数组

    测试增删改查 测试扩容

  • C语言 泛型动态数组

    泛型实现思路:万能指针void *动态数组实现思路:动态进行数组内存的扩容 realloc 泛型动态数组 数组可以...

  • python 源码阅读(一)listObject

    python中 list的实现 python中的LIST非常强大,它既有数组的下标查询优势,又有链表这样动态增减的...

  • 最小子数组和与最大子数组和

    python 使用切片 动态规划 O(n * logn) 最小子数组和,考虑Python的数组切片功能,只能...

  • 栈的基本实现

    基于动态数组的实现

  • 数组,哈希表,字符串

    1,数组 1.1,实现一个动态扩容的数组 1.2,实现一个大小固定的有序数组,支持动态增删改操作 1.3,实现两个...

  • 背包问题

    动态规划 Python 3 实现:

  • 数组 字符串 2019-04-11

    数组 要求 实现一个支持动态扩容的数组 实现一个大小固定的有序数组,支持动态增删改操作 实现两个有序数组合并为一个...

  • 常用算法目录

    数组 实现一个支持动态扩容的数组 实现一个大小固定的有序数组,支持动态增删改操作 实现两个有序数组合并为一个有序数...

  • 数据结构和算法必知必会的50个实现

    数组 实现一个支持动态扩容的数组 实现一个大小固定的有序数组,支持动态增删改操作 实现两个有序数组合并为一个有序数...

网友评论

      本文标题:Python实现动态数组

      本文链接:https://www.haomeiwen.com/subject/oldmectx.html