• 第四周周总结


    2020.03.14

    利用python中得类设计数据结构栈

    class Stack:
        def __init__(self, size = 10):
            #使用列表存放栈的元素
            self._content = []
            #初始栈大小
            self._size = size
            #栈中元素个数初始化为0
            self._current = 0
            
        def empty(self):
            #清空栈
            self._content = []
            self._current = 0
            
        def isEmpty(self):
            return not self._content
    
        def setSize(self, size):
            #如果缩小空间时指定的新大小,小于已有元素个数
            #则删除指定大小之后的已有元素
            if size < self._current:
                for i in range(size, self._current)[::-1]:
                    del self._content[i]
                self._current = size
            self._size = size
        
        def isFull(self):
            return self._current == self._size
            
        def push(self, v):
            #模拟入栈,需要先测试栈是否已满
            if self._current < self._size:
                self._content.append(v)
                #栈中元素个数加1
                self._current = self._current+1
            else:
                print('Stack Full!')
                
        def pop(self):
            #模拟出栈,需要先测试栈是否为空
            if self._content:
                #栈中元素个数减1
                self._current = self._current-1
                return self._content.pop()
            else:
                print('Stack is empty!')
                
        def show(self):
            print(self._content)
    
        def showRemainderSpace(self):
            print('Stack can still PUSH ', self._size-self._current, ' elements.')
    
    #if __name__ == '__main__':
    #    print('Please use me as a module.')
    s=Stack()
    s.push("zheng")
    s.push("jun")
    s.push("long")
    s.show()
    s.pop()
    s.show()
    s.empty()
    

     运行截图:

     

    python中运算符重载,

    class SetSelf(object):
        def __init__(self, data=None):
            if data == None:
                self.__data = []
            else:
                if not hasattr(data, '__iter__'):
                    # 提供的数据不可迭代,实例化失败
                    raise Exception('必须提供可迭代的数据类型')
                temp = []
                for item in data:
                    #集合中的元素必须可哈希
                    hash(item)
                    if not item in temp:
                        temp.append(item)
                self.__data = temp
    
        # 析构方法
        def __del__(self):
            del self.__data
    
        # 添加元素,要求元素必须可哈希
        def add(self, value):
            hash(value)
            if value not in self.__data:
                self.__data.append(value)
            else:
                print('元素已存在,操作被忽略')
    
        # 删除元素
        def remove(self, value):
            if value in self.__data:
                self.__data.remove(value)
                print('删除成功')
            else:
                print('元素不存在,删除操作被忽略')
    
        # 随机弹出并返回一个元素
        def pop(self):
            if not self.__data:
                print('集合已空,弹出操作被忽略')
                return
            import random
            item = random.choice(self.__data)
            self.__data.remove(item)
            return item
    
        # 运算符重载,集合差集运算
        def __sub__(self, anotherSet):
            if not isinstance(anotherSet, SetSelf):
                raise Exception('类型错误')
            # 空集合
            result = Set()
            # 如果一个元素属于当前集合而不属于另一个集合,添加
            for item in self.__data:
                if item not in anotherSet.__data:
                    result.__data.append(item)
            return result
        
        # 提供方法,集合差集运算,复用上面的代码
        def difference(self, anotherSet):
            return self - anotherSet
    
        
        # |运算符重载,集合并集运算
        def __or__(self, anotherSet):
            if not isinstance(anotherSet, SetSelf):
                raise Exception('类型错误')
            result = SetSelf(self.__data)
            for item in anotherSet.__data:
                if item not in result.__data:
                    result.__data.append(item)
            return result
        
        # 提供方法,集合并集运算
        def union(self, anotherSet):
            return self | anotherSet
        
        # &运算符重载,集合交集运算
        def __and__(self, anotherSet):
            if not isinstance(anotherSet, SetSelf):
                raise Exception('类型错误')
            result = SetSelf()
            for item in self.__data:
                if item in anotherSet.__data:
                    result.__data.append(item)
            return result
            
        # ^运算符重载,集合对称差集
        def __xor__(self, anotherSet):
            return (self-anotherSet) | (anotherSet-self)
    
        # 提供方法,集合对称差集运算
        def symetric_difference(self, anotherSet):
            return self ^ anotherSet
    
        # ==运算符重载,判断两个集合是否相等
        def __eq__(self, anotherSet):
            if not isinstance(anotherSet, SetSelf):
                raise Exception('类型错误')
            return sorted(self.__data) == sorted(anotherSet.__data)
    
        # >运算符重载,集合包含关系
        def __gt__(self, anotherSet):
            if not isinstance(anotherSet, SetSelf):
                raise Exception('类型错误')
            if self != anotherSet:
                # 假设当前集合中所有元素都在另一个集合中
                flag1 = True
                # 检查当前集合中是否有元素不在另一个集合中
                for item in self.__data:
                    if item not in anotherSet.__data:
                        # 当前集合中有的元素不属于另一个集合
                        flag1 = False
                        break
    
                # 假设另一个集合的所有元素都在当前集合中
                flag2 = True
                for item in anotherSet.__data:
                    if item not in self.__data:
                        # 另一个集合中有的元素不属于当前集合
                        flag2 = False
                        break
                # 当前集合中有元素不在另一个集合中
                # 而另一个集合中所有元素都在当前集合中
                # 则认为当前集合大于另一个集合
                if  not flag1 and flag2:
                    return True
                return False
    
        # >=运算符重载,集合包含关系
        def __ge__(self, anotherSet):
            if not isinstance(anotherSet, SetSelf):
                raise Exception('类型错误')
            return self==anotherSet or self>anotherSet
        
        # 提供方法,判断当前集合是否为另一个集合的真子集
        def issubset(self, anotherSet):
            return self < anotherSet
    
        # 提供方法,判断当前集合是否为另一个集合的超集
        def issuperset(self, anotherSet):
            return self > anotherSet
    
        # 提供方法,清空集合所有元素
        def clear(self):
            while self.__data:
                del self.__data[-1]
            print('集合已清空')
    
        # 运算符重载,使得集合可迭代
        def __iter__(self):
            return iter(self.__data)
    
        # 运算符重载,支持in运算符
        def __contains__(self, value):
            return value in self.__data
    
        # 支持内置函数len()
        def __len__(self):
            return len(self.__data)
            
        # 直接查看该类对象时调用该函数
        def __repr__(self):
            return '{'+str(self.__data)[1:-1]+'}'
    
        # 使用print()函数输出该类对象时调用该函数
        __str__ = __repr__
    
    s1=SetSelf([1,2,3])
    print(s1)
    s2=SetSelf({5,4,3})
    print(s2)
    s=s1|s2
    print(s)
    

      

  • 相关阅读:
    ES6(严格模式,let&const,箭头函数,解构赋值,字符串扩展方法,Symbol,Set和Map,生成器函数)
    动画实现-微信语音小喇叭样式
    JS与React分别实现倒计时(天时分秒)
    MacOS下如何设置hosts?
    原生JS实现‘点击元素切换背景及字体等’
    mysql数据库设计规范
    如何对 ElasticSearch 集群进行压力测试
    设计实现SAM--无服务器应用模型
    韩立刚计算机网络笔记-第11章 因特网上的音频视频-无线网络
    韩立刚计算机网络笔记-第10章 网络安全
  • 原文地址:https://www.cnblogs.com/zjl-0217/p/12963392.html
Copyright © 2020-2023  润新知