python 数据结构 1

一、栈

线性表 , 后进先出原则的数据结构;存在栈顶和栈底,元素的取出和添加被称为出栈和入栈。(以下代码使用列表形式展现)

push(element): 添加一个新元素到栈顶位置;判断是否栈已经达到最大空间,满了不可以添加。

def push(self, item):

if self.isFull():

raise Exception('stack is full')

self.items.append(item)

pop():移除栈顶的元素,同时返回被移除的元素;判断是否栈为空。

def pop(self):

if self.isEmpty():

raise Exception('stack is empty')

return self.items.pop()

peek():返回栈顶的元素,不对栈做任何修改。

def peak(self):

if self.isEmpty():

raise Exception('stack is empty')

return self.items-1

isEmpty():判断是否为空。

def isEmpty(self):

return len(self.items) == 0

clear():移除栈里的所有元素。

def clear(self):

return self.items.clear()

size():返回栈里的元素个数。这个方法和数组的length属性很类似。

def size(self):

return len(self.items)

class stack:

初始化,创建一个空列表 模拟栈

def init(self, size1):

self.items = \[\]

self.size1 = size1

判断栈是否为空,True 为空

def isEmpty(self):

return len(self.items) == 0

判断栈是否已满,True 为满

def isFull(self):

return len(self.items) == self.size1

入栈操作 判断栈是否已满,是的话抛出异常,中断程序运行,否则继续在栈的尾部添加新的元素

def push(self, item):

if self.isFull():

raise Exception('stack is full')

self.items.append(item)

出栈操作,判断栈是否为空,空的话抛出栈已空的异常,否则在列表末尾移除元素并返回

def pop(self):

if self.isEmpty():

raise Exception('stack is empty')

return self.items.pop()

def peak(self):

if self.isEmpty():

raise Exception('stack is empty')

return self.items-1

def clear(self):

return self.items.clear()

def size(self):

return len(self.items)

二、链表

相互链接的数据节点表。每个节点由两部分组成:数据和指向下一个节点的指针;存储单元上非连续,而且采用动态内存分配,能够有效的分配和利用内存资源;节点删除和插入简单,不需要内存空间的重组。

1、插入节点

在该节点的上一个指针的值赋予新节点的指针,上一个节点的指针指向新节点。

node1 = {'data': '数据1', 'next': '数据2'}

node2 = {'data': '数据2', 'next': '数据3'}

node_a = {'data': '新数据', 'next':''}

在节点1和2之间插入新的节点

node_a'next' = node1'next'

node1'next' = node_a'data'

print(node1)

print(node_a)

print(node2)

"""

{'data': '数据1', 'next': '新数据'}

{'data': '新数据', 'next': '数据2'}

{'data': '数据2', 'next': '数据3'}

"""

2、删除节点

将该节点指向内容赋值到上一个节点指向(也就是没有节点指向被删除的节点)

node1 = {'data': '数据1', 'next': '数据2'}

node2 = {'data': '数据2', 'next': '数据3'}

node3 = {'data': '数据3', 'next': '数据4'}

删除节点2

node1'next' = node2'next'

print(node1)

print(node3)

"""

{'data': '数据1', 'next': '数据3'}

{'data': '数据3', 'next': '数据4'}

"""

代码的体现:

class Node:

def init(self, data=None):

if data is not None:

self.data = data

self.next = None

class LinkedList:

def init(self):

head = Node()

self.head = head

#尾部添加节点

def append(self, data):

new_node = Node(data)

判断头节点后是否还有数据节点,没有直接将新节点连接到头节点后边

if self.head.next is None:

self.head.next = new_node

return

如果头节点后面有数据节点,则遍历链表,找到next为None的数据节点(尾部节点),将新节点连接到尾部节点

node = self.head.next

while True:

if node.next is None:

break

node = node.next

将尾部节点的next 指针指向新的节点

node.next = new_node

def display(self):

node = self.head.next

while node is not None:

print(node.data)

node = node.next

def prepend(self, data):

new_data = Node(data)

if self.head.next is None:

new_data.next = self.head.next

self.head.next = new_data

def remove(self, data):

node = self.head

while True:

if node.next.data == data:

node.next = node.next.next

break

node = node.next

if node.next is None:

raise Exception('data is not found')

相关推荐
CSharp精选营2 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假6 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠7 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦13 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠14 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾14 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82114 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q15 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒15 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记15 天前
单项不带头不循环链表
数据结构·链表