Python入门学习数据与结构4

1.单向循环列表
操作:
单链表的操作:
is_empth() 链表是否为空
length() 遍历整个链表
add(item)链表头部添加元素
append(item)链表尾部添加元素
insert(pos.item)指定位置添加元素
remove(item)删除节点
search(item)查找节点是否存在

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: JMS
@file: my05.py
@time: 2022/05/11
@desc:
"""

class Node(object):    #节点
    def __init__(self,elem):
        self.element=elem
        self.next=None
##用元组也可以实现(elm,None)
###定义链表的数据结构,实现单链表的操作
class SingleCycleLinkList(object):
###单链表
    def __init__(self,node=None):
        self.__head=node
        if node:
            node.next=node
    def is_empty(self):
        return self.__head==None
    def length(self):
        #用cur游标,用来移动遍历节点
        if self.is_empty():
            return 0
        count = 1
        cur=self.__head
        #count用来记录数量

        while cur.next!=self.__head:
            count+=1
            cur=cur.next
        return count
    def travel(self):
        cur=self.__head
        if self.is_empty():
            return
        while cur.next==self.__head:
            print(cur.element,end=' ')
            cur=cur.next
            ##退出循环,cur指向尾结点,但尾结点的元素未打印
        print(cur.element)

    def add(self,item):
        #头插法
        node=Node(item)
        if self.is_empty():
            self.__head=node
            node.next=node
        else:
        ##多一次遍历的过程,把尾结点指向头结点

            cur=self.__head
            while cur.next!=self.__head:
                cur=cur.next
                ##退出循环,cur指向尾结点,但尾结点的元素未打印
            node.next=self.__head
            self.__head=node
        #cur.next=node也可以
            cur.next=self.__head

            #cur.next=self.__head   也可以
    #方法二
    #node.next=self.__head
    #self.__head=node
    #cur.next=node.next
    #cur.next=node
    def append(self,item):
        #尾插法
        node=Node(item)
        if self.is_empty():
            self.__head=node
            node.next=node
        else:
            cur=self.__head
            while cur.next!=self.__head:
                cur=cur.next
            cur.next=node
            node.next=self.__head
    def insert(self,pos,item):
        #:param pos参数 从0开始索引
        if pos<=0:
            self.add(item)
        elif pos>(self.length()-1):
            self.append(item)
        else:
            pre=self.__head
            count=0
            while count<(pos-1):
                count+=1
                pre=pre.next
                #当循环退出后,pre指向pos-1位置
            node=Node(item)
            node.next=pre.next
            pre.next=node
    def remove(self,item):
        if self.is_empty():
            return
        cur=self.__head
        pre=None
        while cur.next!=self.__head:
            if cur.element==item:
                ###先判断此节点是否为头结点
                #头结点:pre=None  or  cur=sel.__head
                if cur==self.__head:
                    ###头结点的情况,找尾结点
                    rear=self.__head
                    while rear.next!=self.__head:
                        rear=rear.next
                    self.__head=cur.next
                    rear.next=self.__head
                else:  ##中间结点
                    pre.next=cur.next
                return
            else:
                pre=cur
                cur=cur.next
        ####退出循环代表尾结点
        if cur.element==item:
            if cur==self.__head:
                ##链表只有一个结点
                self.__head=None
            else:
                pre.next = cur.next
                #pre.next=self.__head
    def search(self,item):

        if self.is_empty():
            return False
        cur = self.__head
        while cur.next!=self.__head:
            if cur.element==item:
                return True
            else:
                cur=cur.next
            if cur.element==item:
                return
        return False

if __name__=="__main__":
    ll=SingleCycleLinkList()


    ll.add(3)
    ll.add(99)
    ll.travel()




  #  ll.remove(100)

2.栈与队列的概念
顺序表: 将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。
链表:将元素存放在通过链接构造起来的一系列存储块中。
栈:存入数据元素、访问元素、删除元素。特点:在于只能允许在容器的一端进行加入数据和输出数据的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的元素。
由于栈数据结构只允许在一端进行操作,因而按照后进先出的原理运作。
队列:
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
队列是一种先进先出的线性表
3.栈的实现
用顺序表(list)来实现一个栈
栈的操作:
1.stack()创建一个新的空栈
2.push(item)添加一个新的元素item到栈顶
3.pop()弹出栈顶元素
4.peek()返回栈顶元素
5.is_empty()判断栈是否为空
6.size()返回栈的元素个数



class Stack(object):
    def __init__(self):
        self.__list=[]
    ###栈
    def push(self,item):
        self.__list.append(item)     ##对于列表,从尾部操作,单链表,从头部操作,达到时间复杂度最低
    def pop(self):
        return self.__list.pop()
    def peek(self):
        if self.__list:
            return self.__list[-1]
        else:
            return None
    def is_empty(self):
        return self.__list==[]
    ##计算return右边的值
        #return not self.__list
    def size(self):
        return len(self.__list)

if __name__=="__main__":
    s=Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    print(s.pop())

4.队列与双端队列的实现
操作:
Queue()创建一个空的队列
enqueue(item)往队列中添加一个item元素
dequeue()从队列头部删除一个元素
is_empty()判断一个队列是否为空
size()返回队列的大小

class Queue(object):
    '''队列'''
    def __init__(self):
        self.__list=[]
    def enqueue(self,item):
        self.__list.append(item)      #self.__list.insert(0,item)   return self.pop()
        ##取决于入队和出队哪个操作更频繁
    def dequeue(self):
        return  self.__list.pop(0)
    def is_emppty(self):
        return self.__list==[]
    def size(self):
        return  len(self.__list)

if __name__=="__main__":
    s = Queue()
    s.enqueue(1)
    s.enqueue(2)
    s.enqueue(3)
    s.enqueue(4)
    print(s.dequeue())

5.双端队列
双端队列是一种具有列队和栈的性质的数据结构
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以再队列任意一端入队和出队。
操作:

class Deque(object):
    '''队列'''
    def __init__(self):
        self.__list=[]
    def add_front(self,item):
        elf.__list.insert(0, item)

    def add_rear(self, item):
        self.__list.append(item)      #self.__list.insert(0,item)   return self.pop()
        ##取决于入队和出队哪个操作更频繁
    def pop_front(self):
        return self.__list.pop(0)
    def pop_rear(self):
        return self.__list.pop()
    def is_emppty(self):
        return self.__list==[]
    def size(self):
        return  len(self.__list)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值