首页 > 其他 > 详细

数据结构

时间:2019-05-11 15:03:25      阅读:120      评论:0      收藏:0      [点我收藏+]

 

 

  • 数据结构是指相互之间存在着一种或多种关系的数据元素的结合和该集合中数据元素之间的关系组成。

  • 简单来说,数据结构就是设计数据 以何种方式组织并存储在计算机中

  • 例如:列表、集合与字典等都是一种数据结构。

  • N.Wirth:"程序=数据结构+算法"

数据结构的分类

数据机构按照其逻辑结构可分为线性结构、树结构、图结构

  1. 线性结构:数据结构中的元素存在一对一的相互关系
  2. 树结构:数据结构中的元素存在一对多的相互关系
  3. 图结构:数据结构中的元素存在多对多的相互关系

 

1、列表/数组

列表(其它语言是数组)是一种基本数据类型。

关于列表问题:

  1、列表的元素是如何存储的?(存内存地址(64位机器固定8bytes))

  2、如何查找元素?(从列表起始位置的内存地址,查第几个元素就起始位置加n*8)

  3、列表不用显示声明长度?(python内部通过完整拷贝来调整列表长度)

 

2、栈

栈(Stack)是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。

栈的特点:后进先出 LIFO

栈的概念:栈顶,栈底

栈的基本操作:

  • 进栈(压栈):push
  • 出栈:pop
  • 取栈顶:gettop

技术分享图片

栈的实现

 使用一般的列表即可实现栈

  • 进栈:li.append
  • 出栈:li.pop
  • 取栈顶:li[-1]
class Stack:

    def __init__(self):
        self.stack = []

    def push(self, data):
        self.stack.append(data)

    def pop(self):
        return self.stack.pop()

    def get_top(self):
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None

    def is_empty(self):
        return len(self.stack) > 0

栈的应用 -- 括号匹配问题

 括号匹配问题:给一个字符串,其中包括小括号、中括号、大括号,求该字符串中的括号是否匹配。

例如:

    • ()()[]{}  匹配
    • ([{()}])  匹配
    • [](             不匹配
    • ([)]            不匹配
技术分享图片
def brace_match(s):
    match = {}: {, ]: [, ): (}
    stack = Stack()
    for ch in s:
        if ch in {(, [, {}:
            stack.push(ch)
        else:   # ch in {},],)}
            if stack.is_empty():
                return False
            elif stack.get_top() == match[ch]:
                stack.pop()
            else:
                return False

    if stack.is_empty():
        return True
    else:
        return False


print(brace_match([{()}(){()}[]({}){}]))
print(brace_match([]}))
View Code

 

3、队列

队列(queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。

  • 进行插入的一点称为队尾(rear),插入动作成为进队或入队。
  • 进行删除的的一端称为对头(front),删除动作称为出队。
  • 队列的性质:先进先出(First-in, First-out)

技术分享图片

队列的实现

初步设想:列表+两个下标指针

创建一个列表和两个变量,front变量指向队首,rear变量指向队尾。初始时,front和rear都为0

进队操作:元素写到li[rear]的位置,rear自增1

出队操作:返回li[front]的元素,front自增1

技术分享图片

出现d的情况后,队列无法继续添加元素,但是列表里面有位置是空的,这一点非常不好

队列的实现原理 -- 环形队列

环形队列:当队尾指针front == Maxsize + 1时,再前进一个位置就自动到0

 实现方式:求余运算

队首指针前进1:front = (front+1) % maxsize

队尾指针前进1:rear = (rear+1) % maxsize

队空条件:rear == front队满条件:(rear+1)% maxsize == front

技术分享图片

技术分享图片
class Queue:
    def __init__(self, size=100):
        self.queue = [0 for i in range(size)]
        self.size = size
        self.rear = 0   # 队尾指针
        self.front = 0  # 队首指针

    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 filled.")

    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 is_empty(self):
        return self.rear == self.front

    # 判断队满
    def is_filled(self):
        return (self.rear + 1) % self.size == self.front


q = Queue(5)
for i in range(4):
    q.push(i)
print(q.pop())
q.push(4)
View Code

队列的内置模块

使用方法:from collections import deque

创建队列:queue = deque(li)

进队:append

出队:popleft

双向队列队首进队:appendleft

双向队列队尾进队:pop

栈和队列的应用 -- 迷宫问题

技术分享图片

解决方法1:栈--深度优先搜索(回溯法)

思路:从一个节点开始,任意找下一个能走的点,当找不到能走的点时,退回上一个点寻找是否有其他方向的点。
(使用栈存储当前路径)

 

数据结构

原文:https://www.cnblogs.com/Xuuuuuu/p/10846124.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!