Skr-Eric的数据结构和算法课堂(一)-- 概述、线性结构的基本实现模型、容器和二叉树结构

数据结构概述

概念:

数据结构:计算机存储和组织数据的方式.

 

分为三层:

抽象层(逻辑结构):数据之间(与计算机无关)的逻辑结构.

分为: 线性结构/非线性结构

其中,非线性结构分为:集合结构/树状结构/网状结构.

A.线性结构(有序性/一对一的前后关系)

  结构中必须存在唯一的首元素

结构中必须存在唯一的尾元素

除首元素外,结构中每一个元素有且只有一个前驱元素

除尾元素外,结构中每一个元素有且只有一个后继元素

B.集合结构(无序性/松散的)

  确定性:要么属于集合要么不属于集合,不存在可能属于或者可能不属于的情况.

无序性:无前后顺序关系.

唯一性:各元素互不相同.

C.树状结构(一对多的父子关系)

  结构中必须存在唯一的根节点

除根元素外,结构中每一元素有且只有一个前驱元素

除叶元素外,结构中每一元素可拥有一个或多个后继元素

D.网状结构(多对多的映射关系)

  结构中每一元素都可拥有任意数量的前驱元素和后继元素

结构中任意两个元素之间均可建立关联

 

逻辑层(物理结构):数据具体在计算机内存中存储方式.

1.顺序存储结构:把逻辑上相邻的元素存储在相邻的物理内存位置中.

优缺点:节省内存空间/方便随机访问/增加或删除元素复杂/降低存储空间的利用率

2.链式存储结构:把逻辑上相邻的元素存储放在不连续的物理内存位置中,通过存放下一数据的链接域连接起来.

优缺点:浪费内存空间/随机访问不方便/增加或删除元素简单/提高存储空间的利用率

 

实现层(运算结构):数据结构的基本操作.

1.创建/删除结构

2.插入/删除/获取/修改元素

3.排序/查找

 

对于逻辑结构和物理结构的关系:

每一种逻辑结构具体采用哪种物理结构来实现没有规定.

 

线性结构的基本实现模型

顺序表:基于顺序存储结构的线性(表)结构

链表:基于链式存储结构的线性(表)结构

分为单向链表和双向链表.

其中单向链表的特征:

  每个节点包含存放的数据元素-data

  每个节点还需要保存指向下一个节点的链接域

  链表尾节点的下一个链接域为空

其中双向链表的特征:

  每个节点包含存放的数据元素-data

  每个节点还需要保存指向下一个节点的链接域

  每个节点还需要保存指向上一个节点的链接域

  链表尾节点的下一个链接域为空

  链表首节点的上一个链接域为空

 

线性结构的容器

栈:

几个基本概念:

  栈顶和栈底:允许数据元素插入和删除的一端称为栈顶,另一端称为栈底

  压入:栈的插入数据操作,也称为入栈/压栈/进栈,常用push

  弹出:栈的删除数据操作,也称为出栈/弹栈,常用pop

基本特征:

  栈限制只能在栈顶进行数据插入和删除操作

栈中数据元素遵循'后进先出'的原则,也称为FILO结构(First In Last Out)

向满栈中压入数据和从空栈中弹出数据,均视为错误

 

队列:

几个概念:

  后端:插入数据元素的端点

前端:删除数据元素的端点

队首和队尾:最先和最后插入的数据元素在被弹出前作为队首和队尾被外界访问

压入:队列的插入操作,也称为入队列

弹出:队列的删除操作,也称为出队列

基本特征:

  队列可以做两端增删数据元素

队列中的数据元素遵循'先进先出'的原则,也称为FIFO结构(First In First Out)

从空队列中弹出数据和向满队列中压入数据,均视为错误

 

 

 二叉树结构

二叉树是最简单的一种树状结构.

基本特征:

  树中每个节点最多关联两个后继节点,也就说,一个节点可能关联的节点数为:0/1/2.

每个节点的后继节点明确分为左右,称为左子节点/右子节点.

 

 

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的贪吃蛇代码实现,使用了队列这一数据结构: ```python import pygame import random # 初始化游戏 pygame.init() # 设置游戏窗口大小 screen_width = 480 screen_height = 480 screen = pygame.display.set_mode((screen_width, screen_height)) # 设置游戏标题 pygame.display.set_caption('贪吃蛇') # 定义颜色 white = (255, 255, 255) black = (0, 0, 0) green = (0, 255, 0) red = (255, 0, 0) # 定义蛇的初始位置和大小 snake_block_size = 10 snake_list = [] snake_length = 1 # 定义食物的初始位置 food_x = round(random.randrange(0, screen_width - snake_block_size) / 10.0) * 10.0 food_y = round(random.randrange(0, screen_height - snake_block_size) / 10.0) * 10.0 # 定义蛇的移动速度 snake_speed = 15 # 定义字体 font_style = pygame.font.SysFont(None, 30) # 定义函数:绘制蛇 def draw_snake(snake_block_size, snake_list): for x in snake_list: pygame.draw.rect(screen, green, [x[0], x[1], snake_block_size, snake_block_size]) # 定义函数:显示消息 def message(msg, color): message = font_style.render(msg, True, color) screen.blit(message, [screen_width / 6, screen_height / 3]) # 主程序 def game_loop(): # 定义全局变量 global food_x, food_y, snake_length, snake_list # 定义初始方向 direction = 'right' # 是否结束游戏的标志 game_over = False # 游戏循环 while not game_over: # 监听事件 for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: direction = 'left' elif event.key == pygame.K_RIGHT: direction = 'right' elif event.key == pygame.K_UP: direction = 'up' elif event.key == pygame.K_DOWN: direction = 'down' # 移动蛇的位置 if direction == 'right': snake_head = [snake_list[-1][0] + snake_block_size, snake_list[-1][1]] elif direction == 'left': snake_head = [snake_list[-1][0] - snake_block_size, snake_list[-1][1]] elif direction == 'up': snake_head = [snake_list[-1][0], snake_list[-1][1] - snake_block_size] elif direction == 'down': snake_head = [snake_list[-1][0], snake_list[-1][1] + snake_block_size] # 将蛇头加入到蛇列表中 snake_list.append(snake_head) # 如果蛇头和食物坐标重合,则食物被吃掉,重新生成一个食物 if snake_head[0] == food_x and snake_head[1] == food_y: food_x = round(random.randrange(0, screen_width - snake_block_size) / 10.0) * 10.0 food_y = round(random.randrange(0, screen_height - snake_block_size) / 10.0) * 10.0 snake_length += 1 # 如果蛇的长度超过了1,删除蛇尾的坐标 if len(snake_list) > snake_length: del snake_list[0] # 如果蛇头碰到了边界或者碰到了自己的身体,则游戏结束 for block in snake_list[:-1]: if block == snake_head: game_over = True if snake_head[0] >= screen_width or snake_head[0] < 0 or snake_head[1] >= screen_height or snake_head[1] < 0: game_over = True # 绘制游戏界面 screen.fill(black) pygame.draw.rect(screen, red, [food_x, food_y, snake_block_size, snake_block_size]) draw_snake(snake_block_size, snake_list) pygame.display.update() # 控制游戏速度 clock = pygame.time.Clock() clock.tick(snake_speed) # 显示游戏结束的消息 message('Game Over!', red) pygame.display.update() pygame.time.wait(2000) # 关闭游戏 pygame.quit() quit() # 启动游戏 game_loop() ``` 以上代码使用了 `snake_list` 队列来存储蛇的身体坐标,每次移动时将蛇头加入到队列末尾,如果蛇的长度超过了1,则删除队列头部的坐标。在检测碰撞时,只需要检测蛇头是否与队列中的其他坐标重合即可。在游戏结束后,使用 `pygame.time.wait()` 函数来等待一段时间,再关闭游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值