数据结构学习

P46~P51
数据结构:数据+数据之间的关系
堆是一种特殊的二叉树
数据之间的关系:
①线性结构:数据结构中存在一对一的相关关系,列表
②树结构:数据结构中存在一对多的相关关系
③图结构:(地图)数据结构中存在多对多的相关关系

一、线性结构:
1. 列表
增删改查
由于python的列表中可以存储不同类型的数值,所以python中存储的实际上不是数值本身,而是数值的地址

# 列表增删改查
l=[1,2,3,4,5]
l2=[2]*4
# 增
l.append(6)
l.extend(l2)
l.insert(0,23) # 下标,数值
l+l2
# 删
l.pop(3) # 下标
del l[0]
l.remove(2) # 数值,删除某个元素
# 改
l[0]=2
# 查
l.index(2) # 数值,返回被查元素的首下标
l.count(2) # 数值,计数
# 排序
l.sort(reverse=True) # 降序

2. 栈:只能再一端进行插入或删除操作的列表
栈的概念:栈顶、栈底
栈的基本操作:
进栈(压栈):push,在栈顶加入元素l.append()
出栈:pop,取走栈顶元素l.pop()
取栈顶:gettop,查看栈顶元素 l[-1]

# 栈的类

class Stack:
    def __init__(self): # 创建一个类的实例对象
        self.stack = []
    def push(self,element): # 进栈
        self.stack.append(element)
    def pop(self): # 出栈
        return self.stack.pop()
    def get_top(self):
        if len(self.stack) > 0: # 非空栈
            return self.stack[-1]
        else:
            return None
    def if_empty(self): # 判断列表是否为空
        return len(self.stack)==0
    def put(self):
        print(self.stack)
    
stack =Stack()
stack.push(1)
stack.push(3)
stack.push(5)
stack.if_empty()
stack.put()
# 匹配括号
s1='({[]})'
s2='[}'
s3='[][{}({}[][({[]})])]'
# 每次只有左括号进栈,右括号与其匹配,匹配成功则左括号出栈,不成功直接返回False
def brace_match(s):
    match={'}':'{',']':'[',')':'('}
    stack=Stack()
    for ch in s:
        if ch in {'(','{','['}:
            stack.push(ch)
        else:
            if stack.if_empty():
                return False # 第一个就是]})不匹配
            elif stack.get_top()==match[ch]:
                stack.pop() # 每次都和左括号匹配,匹配成功则将这个左括号出栈
            else:
                return False
    if stack.if_empty():
        return True
    else:
        return False
print(brace_match(s1))
print(brace_match(s2))
print(brace_match(s3))

3. 队列:一个数据集合,仅允许从队列的一端进行插入,另一端进行删除
队尾:能进行插入的一端,插入动作称为进队或入队
队头:能进行删除的一端,删除动作称为出队
队列的性质:先进先出
环形队列:当rear和front再次碰头时完成了整个进队出队的周期

# 队
class Queue():
    def __init__(self,size):
        self.queue=[0 for i in range(size)]
        self.size =size
        self.rear=0 # 队尾指针
        self.front=0 # 队首指针
        # 判断队空
    def is_empty(self):
        return self.rear == self.front
    # 判断队满
    def is_filled(self):
        return (self.rear+1)%self.size == self.front
    def push(self,element):
        if not self.is_filled():
            self.rear = (self.rear+1)%self.size
            self.queue[self.rear] = element
        else:
            raise IndexError("Queue is empty!")
    def pop(self):
        if not self.is_empty():
            self.front = (self.front + 1)%self.size
            return self.queue[self.front] # 弹出队首
        else:
            raise IndexError("Queue is empty!")
    def put(self):
        print(self.queue)

q=Queue(5)
for i in range(4): # 要少一位否则会判断为满队
    q.push(i)
q.pop()
q.put()

-------------
P57~P58
4. 链表
链表是由一系列节点组成的元素集合。每个节点包含两部分,数据item和指向下一个节点的指针next。通过节点之间的相互连接,最终串联成一个链表。
创建链表的方法:头插法、尾插法

# 链表
class Node():
    def __init__(self,item):
        self.item = item
        self.next = None
a=Node(1)
b=Node(2)
c=Node(3)
a.next=b
b.next=c
'''
a -> b -> c
1 -> 2 -> 3
'''
print(a.next.next.item)

# 将列表以头插法转为链表
# 头插法是倒序
def create_linklist(li):
    head=Node(li[0])
    for element in li[1:]:
        node=Node(element)
        node.next=head
        head=node
    return head
def print_linklist(head):
    while head:
        print(head.item,end=' ')
        head=head.next
lk=create_linklist([1,2,3,4])
'''
4 -> 3 -> 2 -> 1
'''
print_linklist(lk)

# 尾插法是升序
def create_linklist_tail(li):
    head=Node(li[0])
    tail=head
    for element in li[1:]:
        node=Node(element)
        tail.next=node
        tail=node
    return head
lk=create_linklist_tail([1,2,3,4])
print_linklist(lk)

5. 哈希表

——————————————————————————————
P65~P72
二、树结构

# 二叉树
class BiTreeNode:
    def __init__(self,data):
        self.data=data
        self.lchild=None
        self.rchild=None

a=BiTreeNode('a')
b=BiTreeNode('b')
c=BiTreeNode('c')
d=BiTreeNode('d')
e=BiTreeNode('e')
f=BiTreeNode('f')
g=BiTreeNode('g')

e.rchild=g
e.lchild=a
a.rchild=c
c.rchild=d
c.lchild=b
g.rchild=f

root=e
print(root.lchild.rchild.data)


1. 二叉树

# 前序遍历
def pre_order(root):
    if root:
        print(root.data)
        pre_order(root.lchild)
        pre_order(root.rchild)
pre_order(root) # e a c b d g f 
# 中序遍历
def in_order(root):
    if root:
        in_order(root.lchild)
        print(root.data,end=' ')
        in_order(root.rchild)
in_order(root) #a b c d e g f
# 后序遍历
def post_order(root):
    if root:
        post_order(root.lchild)
        post_order(root.rchild)
        print(root.data,end=' ')
post_order(root) # b d c a f g e 
# 层次遍历
def level_order(root):
    queue = deque() #创建一个队列
    queue.append(root) # 加入根节点
    while len(queue) > 0: #只要队不空
        node = queue.popleft()  #出队最前面的那个
        print(node.data, end=' ') # 打印最前面的那个节点
        if node.lchild:
            queue.append(node.lchild)
        if node.rchild:
            queue.append(node.rchild)
level_order(root) # e a g c f b d 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值