使用ctypes实现动态数组

Demon:使用ctypes实现动态数组

  • 使用面向对象程序设计方式实现列表的CRUD操作

    类名:MyArray
    成员:Python对象
    操作:扩容及增加、修改、删除、查询元素
    进阶:排序

  • 注意:

    • ctypes是Python自带的函数库,提供了一系列与C/C++语言兼容的数据结构类与方法,可以进行Python与C之间的数据交换与相互调用
    • (5 * ctypes.py_object)()表示创建一个含有5个python对象作为元素的数组
  • 代码

# @功能描述:实现动态数组
# @程序作者:一只萤火虫

import ctypes


class DynamicArray:
    """
    自己实现的动态数组类
    """
    def __init__(self, capacity=16):
        """
        1、创建动态数组对象后,首先分配固定的空间大小(数组空间),默认16个元素空间
        2、可以调用对象的方法添加元素,如果预留的空间大小不够了,那么允许扩容:*2
        """
        self._length = 0            # 当前动态数组中的元素个数
        self._capacity = capacity   # 动态数组的初始化空间大小
        # self._elements = None       # 动态数组对象中,实际保存元素的结构(数组)
        self._elements = self.___make_array(self._capacity)

    def ___make_array(self, capacity):
        """ 返回通过调用底层实现创建的动态空间 """
        return (capacity * ctypes.py_object)()

    def __getitem__(self, index):
        if not 0 <= index < self._length:
            # 如果数组下标错误,那么可以进行提示,也可以直接抛出异常
            raise IndexError("数组下标越界!")
        return self._elements[index]

    def __setitem__(self, index, value):
        if not 0 <= index < self._length:
            raise IndexError("数组下标越界!")
        self._elements[index] = value

    def __resize(self, new_capacity):
        """ 扩容方法 """
        new_array = self.___make_array(new_capacity)
        # 将原来空间的元素复制到新空间中
        for i in range(self._length):
            new_array[i] = self._elements[i]
        del self._elements
        # 记得更新容量大小
        self._capacity = new_capacity
        self._elements = new_array

    def append(self, element):
        """ 将传入的元素添加到内部数组的最后位置 """
        if self._length == self._capacity:
            self.__resize(self._capacity * 2)
        self._elements[self._length] = element
        self._length += 1

    def find(self, element):
        """ 查找传入元素的下标 """
        for i in range(self._length):
            if element == self._elements[i]:
                return i
        return -1

    def remove(self, element):
        """ 删除指定的元素 """
        remove_index = self.find(element)
        if remove_index == -1:
            print("没有找到要删除的元素!")
            return
        # 如果找到了要删除的元素:后面一个元素赋值给前面一个元素
        # 最后总长度-1
        for i in range(remove_index, self._length - 1):
            self._elements[i] = self._elements[i + 1]
        self._length -= 1

    def insert(self, index, element):
        """ 在指定下标处插入元素 """
        if not 0 <= index < self._length:
            raise IndexError("插入的下标越界,无法进行插入操作!")
        if self._length == self._capacity:
            self.__resize(self._capacity * 2)
        for i in range(self._length, index, -1):
            self._elements[i] = self._elements[i - 1]
        self._elements[index] = element
        self._length += 1

    def get_capacity(self):
        return self._capacity

    def __len__(self):
        return self._length

    def __str__(self):
        contents = "【"
        for i in range(self._length):
            contents += str(self._elements[i]) + ", "
        contents = contents[0:-2] + "】"
        return contents

    def sort(self):
        for i in range(1, self._length):
            curr_element = self._elements[i]
            j = i - 1
            while j >= 0 and self._elements[j] > curr_element:
                self._elements[j + 1] = self._elements[j]
                j -= 1
            self._elements[j + 1] = curr_element


if __name__ == '__main__':
    array1 = DynamicArray()
    # array1[0] = 123           # 经过测试,不建议使用这种方式赋初值
    # array1[2] = 456
    # array1.append("abc")
    # array1.append("def")
    # array1[0] = "hello"
    for i in range(33):
        array1.append(i)
    print(array1)
    print("当前动态数组的容量:", array1.get_capacity(), "实际元素个数:", len(array1))
    print("删除元素")
    array1.remove(22)
    print(array1)
    print("插入元素:")
    array1.insert(4, 9999)
    print(array1)
    print("排序:")
    array1.sort()
    print(array1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值