基本数据结构
1. 线性数据结构
线性数据结构是指元素与其前后元素相对位置保持不变的数据集合。线性数据结构具有两端,分别为:左端、右端(也称:前端+后端/顶端+底端)。基本的数据结构中,栈、队列、链表、串和数组都属于线性数据结构,这些基本数据结构的区别在于添加元素和移除元素的顺序。
2. 栈
2.1 栈
栈实现的是后进先出(last-in,first-out,LIFO)的策略,其添加和移除如下图所示。
栈的移除和添加只在顶端进行,移除操作时,只能先移除7、再移除6、接着移除5…,添加操作时,新加入的元素压入栈顶。
2.2 python列表实现栈
class stack:
def __init__(self):#创建栈
self.items = []
def isEmpty(self):#判断栈是否为空
return self.items == []
def push(self, item):#添加元素
return self.items.append(item)
def pop(self):#移除元素
return self.items.pop()
def peek(self):#返回栈顶元素
return self.items(len(self.items)-1)
def size(self):#返回栈的长度
return len(self.items)
3. 队列
3.1 队列
队列实现的是先进先出(fist-in,first-out,FIFO)的策略,其添加和移除如下图所示。
队列的移除和添加分别在两端进行,移除操作时,只在右端进行移除,只能先移除7、再移除6、接着移除5…,添加操作时,在左端加入。新加入的元素需等待前面的元素移出后才能被取出。
3.2 python列表实现队列
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)
3.3 双向队列
3.1和3.2节介绍的是“单向队列”,在队列中还存在另外一种数据结构——双向队列。
双向队列的两端都可以进行移除元素和添加元素操作。
#python实现
class Queue:
def __init__(self):#创建队列
self.items = []
def isEmpty(self):#判断是否为空
return self.items == []
def leftEnqueue(self, item):#左端添加元素
self.items.insert(0, item)
def leftDequeue(self):#左端移除元素
return self.items.pop(0)
def rightEnqueue(self, item):#右端添加元素
self.items.append(item)
def rightDequeue(self):#右端移除元素
return self.items.pop()
def size(self):#返回队列长度
return len(self.items)
4. 链表
4.1 链表
链表分为单链表、循环链表、双向链表、二叉链表、十字链表、邻接表和邻接多重表。
单链表:整个链表的存储从从头指针开始,头指针指向链表的第一个结点(即第一个数据元素,也称为首元结点)的存储位置,而最后一个结点的指针为空。
![]()
数据存储示例
![]()
对应单链表逻辑状态
头指针可唯一确定单链表;
每一个结点包含数据变量和下一个结点的引用。
首元结点指链表中存储第一个数据元素的结点(ZHAO),头结点指首元结点之前的结点(L),头指针是指向链表第一个结点的指针。
4.2 python列表实现单链表
class Node:#结点类
def __init__(self, initdata):#初始化
self.data = initdata
self.next = None
def getData(self):#返回数据
return self.data
def getNext(self):#返回引用
return self.next
def setData(self, newdata):#存储数据
self.data = newdata
def setNext(self, newnext):#存储引用
self.next= newnext
class linkList:#链表类
def __init__(self):
self.head = None
self.tail = None
def isEmpty(self):#链表是否为空
return self.head = None
def addHead(self, item):#添加元素,头插法
newnode = Node(item)
newnode.setNext(self.head)
self.head = newnode
def addTail(self, item):#添加元素,尾插法
newnode = Node(item)
self.tail.setNext(newnode)
self.tail= newnode
def remove(self, item):#移除指定元素
cur = self.head
pre = None
flag= True
while flag:#获取移除元素位置
if cur.getData() == item:
flag = False
else:
pre = cur
cur = cur.getNext()
if pre == None:#移除
self.head = cur.getNext()
else:
pre.setNext(cur.getNext())
def getLength(self):#返回链表长度
cur = self.head
count = 0
while cur != None:
count += 1
cur = cur.getNext()
return count
def insert(self, item, pos):#在第pos个结点后插入新结点
newnode = Node(item)
cur = self.head
for i in range(pos):cur = cur.getNext()
newnode.setNext(cur.getNext())
cur.setNext(newnode)