4 Python基本数据结构

tech2022-07-11  182

4 Python基本数据结构

4.1栈4.2 队列4.3双端队列4.4栈、队列和双端队列的区别4.5链表4.5.1节点4.5.2无序链表4.5.3有序链表 运行前,在python文件夹下通过pip install pythonds包。

4.1栈

栈的结构特性是“先进后出”。这一特性可以应用在结果只是二元的情况中,如()的判断,遇到(压栈,遇到)则出栈,通过栈是否为空来判断()是否成对,又如十进制化成二进制,因为余数只是1或0。 实现栈的代码如下所示:

class Stock(): def __init__(self): self.item = [] def push(self,t): self.item.append(t) def pop(self): return self.item.pop() def peek(self): return self.item[len(self.item)-1] def isEmpty(self): return self.item == [] def size(self): return len(self.item)

这里注意到,在pythonds包里的Stack()类的pop()函数采用数组pop()来编写的,为了保证栈先进后出的特性,因此栈的元素是呈从左向右为先到后的关系,即1,2,3,4…最先添加进去的1在最左边。

4.2 队列

与栈区别的话,队列的是一个两端都可以操作的数组,队的特点是“先进先出”,实现代码如下:

class Queue: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def enqueue(self, item): self.items.insert(0,item) def dequeue(self): return self.items.pop() def size(self): return len(self.items)

其中,代码采用数列的pop()来出队,即在列表的尾部操作为最先的元素,故进队的元素必须在列表头部,故采用insert(0,)函数。总之,队的元素呈现从左到右依次为后到先的顺序,即…4,3,2,1最先进队的是1。

4.3双端队列

双端队列有一前一后两端,元素在各个端进行相应的队列操作(先进先出)。双端队列的出队操作也是用pop()函数编写的,因此和队列一样,它的前后端的顺序均为从左向右为后到先的顺序。

class Deque: def __init__(self): self.item = [] def isEmpty(self): return self.item == [] def addFront(self,item): self.item.append(item) def addRear(self,item): self.item.insert(0,item) def removeFront(self): return self.item.pop() def removeRear(self): return self.item.pop(0) def size(self): return len(self.item)

4.4栈、队列和双端队列的区别

4.5链表

4.5.1节点

为了完成无序链表的元素既要有数据,又要知道下一个元素位置而专门定义了一个类。①节点包含两个属性,data和next来对应它的特性。②在注意两个get函数,getNext返回的是self.next这个节点一般用于遍历列表。③初始化的时候,默认self.next=None,而又定义了一个setNext函数来设置下一个节点,由类的特性,在设置下一节点的时候,可以采用两种方式,如代码①②。

class Node: def __init__(self,data): self.data = data self.next = None def getData(self): return self.data def getNext(self): return self.next def setData(self,data): self.data = data def setNext(self,node): self.next = node a = Node(1) b = Node(2) c = Node(3) ① # a.setNext(b) # b.setNext(c) ② a.next = b b.next = c print(a.next.next.getData)

4.5.2无序链表

以1,2,3的顺序添加元素,第一个进去的是1,但是作为头节点的却是最后一个进去的3。

class UnorderedList: def __init__(self): self.head = None def addData(self,data): temp = Node(data) temp.setNext(self.head) self.head = temp def isEmpty(self): return self.head == None def length(self): current = self.head count = 0 while current != None: count = count + 1 current = current.getNext() return count def search(self,data): current = self.head found = False while current != None and not found: if current.getData() == data: found = True else: current = current.getNext() return found def remove(self,data): current = self.head pre = None found = False while not found: if current.getData() == data: found = True else: pre = current current = current.getNext() if pre == None: self.head = current.getNext() print("i am head") else: pre.setNext(current.getNext()) a = UnorderedList() a.addData(1) a.addData(2) a.addData(3) print(a.head.getData()) 运行结果:3 a.remove(3) 运行结果:i am head

4.5.3有序链表

有序链表和无序链表其本质的区别在于添加元素时的方法不一样,无序链表添加元素是通过头结点来实现的,而有序链表在添加元素时要先查找这个元素应该放置的位置,然后断开链表把元素添加进去。现在分析有序链表的查找元素方法(search)和添加元素的方法(addData)。

def search(self,item): current = self.head stop = False found = False while current != None and not found and stop: if item == current.getData(): ##表示直接找到了 found = True else: ##有序表特点,如果大于了item再next也是大于的 if current.getData() > item: ##剩下的不会等于,没必要继续search下去了 stop = True else: current = current.setNext() return found def addData(self,item): current = self.head ##pre用于追踪要插入的节点前的位置,并且判断是否是头节点处 per = None stop = False while current != None and not stop: ##找到插入节点的后面的位置 if current.getData() > item: stop = True else: pre = current current = current.getNext() temp = Node(item) if pre == None: temp.setNext(self.head) self.head = temp else: temp.setNext(current) pre.setNext(temp)
最新回复(0)