一、什么叫数据结构

数据结构是计算机存储、组织数据的方式。指的是相互之间存在一种或多种特定关系的数据元素的集合。-- 百度百科

  • 比喻成一个企业的组织结构,组织结构其实就是部门与部门之间的关系结构
  • 数据结构就是用来描述数据与数据之间的关系
    线性和非线性数据结构

二、常见的数据结构

  • 按逻辑结构分类
    线性结构:数据元素之间一对一的关系

     const arr = ['1', '2', '3'];
    

    非线性结构:数据元素之间一对多的关系

  • 按储存方式分类

  • 顺序存储:Set、Array

  • 散列存储:Map、Object

  • 链式存储:链表

  • 索引储存:SQL

三、线性数据结构——栈

  • 栈是一种遵从先进后出 (LIFO) 原则的有序集合

  • 栈的特点:只能在某一端(只有一个口子)添加或删除数据,遵循先进后出的原则

  • 插入操作在栈中被称作入栈(push)

  • 删除操作栈中被称作退栈(pop)

  • 使用场景:方法调用作用域

  • js模拟栈

class Stack {constructor () {this.stack = []}// 新增数据push (item) {return this.stack.push(item)}// 删除数据pop () {return this.stack.pop()}// 修改数据(栈中不能直接修改数据,需将数据取出后修改,再放回栈中)// 查 栈中只能读取最外层数据peek () {return this.stack[this.getSize() - 1]}// 获取栈内有多少条数据getSize () {return this.stack.length}// 检测栈内数据是否为空isEmpty () {return this.getSize() === 0}}
  • 栈的应用:

有效的括号(力扣)

给定一个只包括’(’,’)’,’{’,’}’,’[’,’]'的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

  • 解题思路
  1. 用栈模拟括号的顺序
  2. 可以创建一个对象,建立左右括号的对应关系,key 为左括号,value 为右括号
  3. 遍历字符串的每一个字符
  4. 如果是左括号,入栈
  5. 如果是右括号,判断栈顶的第一个元素与当前右括号是否对应?如果不对应,就返回 false
  6. 遍历完之后保证栈内为空
class Stack {constructor () {this.stack = []}// 新增数据push (item) {return this.stack.push(item)}// 删除数据pop () {return this.stack.pop()}// 修改数据(栈中不能直接修改数据,需将数据取出后修改,再放回栈中)// 查 栈中只能读取最外层数据peek () {return this.stack[this.getSize() - 1]}// 获取栈内有多少条数据getSize () {return this.stack.length}// 检测栈内数据是否为空isEmpty () {return this.getSize() === 0}}/**
* @description:
* @param {string} str
* @return: boolean
*/
let isValid = function (str) {// 创建一个对象,建立左右括号的对应关系,key 为左括号,value 为右括号const Map = {'{' : '}','(' : ')','[' : ']'}const myStack =  new Stack()for (item of str) {// 判断是否为左括号if (Map[item]) {myStack.push(item)} else {const last = myStack.pop()// 判断是是与之对应的右括号if (item !== Map[last]) return false}}// 保证栈内为空return myStack.getSize() === 0
}// isValid('()') // true
isValid('(]){}') // false

四、线性数据结构——队列

  • 队列是一种遵从先进先出 (FIFO) 原则的有序集合

  • 队列一个线性结构,特点是在某一端添加数据,在另一端删除数据,遵循先进先出的原则。

  • 插入(insert)操作也称作入队(enqueue

  • 删除(delete)操作也被称为出队(dequeue)

  • js模拟队列

class Queue {constructor () {this.queue = []}// 入队(增)enQueue (item) {return this.queue.push(item)}// 出队(删)deQueue () {return this.queue.shift()}// 要修改队列中的数据也是需要将数局先取出来修改然后在将其放回// 获得队列中第一个数据getHeader () {return this.queue[0]}// 获取队列的大小getSize () {return this.queue.length}// 判断队列是否为空吗isEmpty () {return this.getSize() === 0}
}
  • 队列的应用

数据流中的移动平均值(力扣)

给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。

示例:

MovingAverage m = new MovingAverage(3);
m.next(1) = 1
m.next(10) = (1 + 10) / 2
m.next(3) = (1 + 10 + 3) / 3
m.next(5) = (10 + 3 + 5) / 3
  • 解题思路
  1. 使用队列添加整数
  2. 创建成员变量来保存计算的值
  3. 新增整数,进行入队操作
  4. 累加整数并保存
  5. 如果队列大小超出窗口大小,进行出队操作,并对成员变量进行减法。
  6. 返回平均值
class Queue {constructor () {this.queue = []}// 入队(增)enQueue (item) {return this.queue.push(item)}// 出队(删)deQueue () {return this.queue.shift()}// 要修改队列中的数据也是需要将数局先取出来修改然后在将其放回// 获得队列中第一个数据getHeader () {return this.queue[0]}// 获取队列的大小getSize () {return this.queue.length}// 判断队列是否为空吗isEmpty () {return this.getSize() === 0}
}let MovingAverage = function(size) {this.windowSize = sizethis.myQueue = new Queue()this.sum = 0console.log('0000')
}
/**
* @description:
* @param {number} val
* @return: {number}
*/
MovingAverage.prototype.next = function(val) {// 超出窗口大小就让第一个元素出队,累加和减去这个值if (this.myQueue.getSize() >= this.windowSize) {this.sum -= this.myQueue.getHeader()this.myQueue.deQueue()}this.myQueue.enQueue(val)this.sum += valconsole.log('sum', sum)return this.sum / this.myQueue.getSize()
}

数据结构——线性数据结构相关推荐

  1. python中的线性数据结构

    ''' https://www.bilibili.com/video/av19992545/?p=1python中的线性数据结构线性数据结构是计算机组织数据的一种方式必须满足以下四个要求才是线性数据结 ...

  2. 数据结构(一)线性数据结构

    数据结构分为:线性数据结构.非线性数据结构 线性数据结构包括:数组.线性表.栈.队列.串 非线性数据结构包括:多维数组.集合.树.Hash 1.数组 在Java中常用的数组util有String[], ...

  3. 线性数据结构和非线性数据结构(java版)

    文章目录 线性数据结构和非线性数据结构 数据结构 非线性结构 稀疏Sparsearray 数组 队列 数组模拟队列 数组模拟环形队列 链表 单链表 双向链表 约瑟夫问题 栈 数组模拟栈 使用栈完成表达 ...

  4. 数据结构——初识数据结构

    数据结构(计算机408考研科目) 首先我们提出一个问题:数据结构是在学习什么? 带着这个疑问我们来观察一下我们身边的世界. 从一日三餐,吃穿住行来看: 1.我们有时不想做饭时,我们可以打开手机去点外卖 ...

  5. 数据结构:线性数据结构(3)-deques(栈,队列,deques, 列表)

    deque(也称为双端队列)是与队列类似的项的有序集合.即使 deque 可以拥有栈和队列的许多特性,它不需要由那些数据结构强制的 LIFO 和 FIFO 排序.这取决于你如何持续添加和删除操作. 1 ...

  6. 数据结构:线性数据结构(2)-队列(栈,队列,deques, 列表)

    队列:FIFO 1.队列的抽象数据类型 队列抽象数据类型由以下结构和操作定义.如上所述,队列被构造为在队尾添加项的有序集合,并且从队首移除.队列保持 FIFO 排序属性.队列操作如下: Queue() ...

  7. 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)

    栈,队列,deques, 列表是一类容器,他们数据项之间的顺序由添加或删除的顺序决定,一旦一个数据项被添加,它相对于前后元素一直保持该位置不变.注入此类的数据结构称为线性数据结构. 栈 栈(栈,队列, ...

  8. python单链表实现具体例子_Python实现数据结构线性链表(单链表)算法示例

    本文实例讲述了Python实现数据结构线性链表(单链表)算法.分享给大家供大家参考,具体如下: 初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码. #!/usr/bin ...

  9. 数据结构-线性表之用队列实现栈用栈实现队列

    文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...

最新文章

  1. 查看、分析memcached使用状态
  2. Oracle再发力,区块链平台多项更新
  3. feign_与Feign客户轻松进行REST通信
  4. python统计excel出现次数_Python读取Excel一列并计算所有对象出现次数的方法
  5. 51nod 1138 连续整数的和(数学公式)
  6. 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
  7. Asp组件中级入门与精通系列之三
  8. 新手小白Linux(Centos6.5)部署java web项目(mongodb4.0.2安装及相关操作)
  9. c语言用户管理系统的知识,C语言系统用户管理系统
  10. 餐饮为什么很难做到薄利多销?
  11. 如何才能在大数据中获取价值
  12. Ad-Hoc Query入门
  13. u3d目标与摄像机之间的遮挡物变为透明
  14. 整人电脑BAT小程序源码大全
  15. 差分约束——vijos1589
  16. 炸弹小分队-超详细开服教程,教你如何开炸弹小分队服务器公开派对房间
  17. Ddos攻击怎么防护?DDOS八大防御策略
  18. python excel 空值,python 删除空值且合并excel的操作
  19. java嵌套条件运算符_java条件运算符的嵌套使用
  20. Apache漏洞汇总:

热门文章

  1. 双卡双待手机[海信]挂断来电和指定卡去电实现
  2. 爬虫html转换成pdf,爬取html生成pdf
  3. java dsl_我使用DSL编写SQL的一个Java实现
  4. Vertx(Java版)Http的Get、Post请求(含有参数)及响应
  5. 翻译翻译,什么是滑动窗口
  6. 利用word漏洞制作Windows反弹木马
  7. 亿级PV请求的三种负载均衡技术(转)
  8. struts2表单验证里validato 的type值及其含义
  9. 后端使用JsonResult类返回数据
  10. 界面开发工具之HTML色彩表格工具