开始学习数据结构啦

一、什么是数据结构

    1.数据结构的起源

        1968年,美国高德纳教授,《计算机程序设计艺术》第一卷《基本算法》的出版,开创了数据结构和算法的先河。

        数据结构是一门研究数据之间关系和操作的学科,而非计算方法

        数据结构+算法=程序,沃斯凭借这个观点拿到了图灵奖,这句话展示了程序的本质

    2.数据结构的基本概念

        数据:所有能输入到计算机中,能被程序处理的描述客观事物的符号

        数据项:有独立含义的最小单位,也叫做域【结构的成员项】

        数据元素:组成数据的,有一定意义的基本单位,也叫做节点、记录。一个数据元素由若干个数据项组成【结构变量】

        数据结构:相互之间存在一种或多种特定关系的数据元素集合

        算法:数据结构所具备的功能,解决特定问题的方法

    3.数据结构的三个方面

        数据的逻辑关系

        数据的存储关系

        数据结构的运算

二、逻辑关系和存储关系

    数据的逻辑关系:

        集合:数据元素同属于一个集合,但元素之间没有任何关系

        线性结构:数据之间存在一对一的关系(表)

        树型结构:数据元素之间存在一对多发关系(树)

        图型结构:数据之间存在多对多的关系(图)

    

    数据的存储结构:

    顺序结构:数据元素存储在连续的内存中,用数据元素的相对位置来表示关系

        优点:支持随即访问,访问效率高,适合查找数据

        缺点:空间利用率读、对内存要求极高,插入、删除不方便

    链式结构:数据元素存储在彼此独立的内存空间中,每个数据元素中增加一个数据项用于存储其它元素的地址,以此来表示数据元素之间的关系

        优点:空间利用率高、插入、删除方便、适合频繁增删数据

        缺点:不支持随机访问、只能从前到后逐个访问

    逻辑结构与存储结构的对应关系:

        表  顺序    链式

        树  链式    顺序

        图  顺序+链式

        每种逻辑结构采用什么物理存储方式没有明确规定,通常根据实现的难易程度以及空间、时间方面的需求,来选择最合适的物理存储结构

三、数据结构的运算

    1.建立数据结构      create

    2.销毁数据结构      destory

    3.清空数据结构      clean

    4.数据结构排序      sort

    5.插入元素          insert

    6.删除元素          delete

    7.访问元素          access

    8.修改元素          modify

    9.查询元素          query

    10.遍历数据结构     show print ergodic

四、顺序表和链式表的实现

    顺序表:

        数据项:

            存储元素的内存首地址

            表的容量

            元素的数量

        

        运算:

            创建、销毁、清空、插入、删除、访问、查询、修改、排序、遍历

        注意:

            1.不要越界

            2.时刻保持元素的连续性

        优点:

            支持随机访问,修改、访问、排序的效率比较高,大块的连续的内存不容易产生内存碎片

        缺点:

            对内存要求比较高(内存连续),插入、删除元素时不方便、效率低

    

    链式表:(list)

        节点的数据项:

            数据域:可以时若干个各种类型的数据项组成

            指针域:指向下一个节点

        由若干个节点通过指针域连接在一起,形成链式表

        不带头节点的链表:第一个节点的数据域存储的是有效的数据

            添加、删除时有可能会改变第一个节点的指针指向,参数需要传递二级指针,而且删除第一个节点时需要额外处理

        带头节点的链表:第一个节点不参与存储有效数据,仅仅只是用于指向第一个数据域有效节点

        注意:操作需要从第二个节点(也就是第一个有效数据节点)开始

功能受限的表:
    栈:只有一个进出的出入口的表结构,先进后出,FILO
        顺序栈:
            数据项:
                存储元素的内存首地址
                栈的容量
                栈顶的位置
            运算:
                创建、销毁、入栈、出栈、栈空、栈满、栈顶

        注意:
            满增栈,满减栈:栈顶指向顶部的第一个数据
            空增栈,空减栈:栈顶指向接下去要入栈的位置

        链式栈:
            数据域:
                栈顶
                节点数量
             运算:
                创建、销毁、入栈、出栈、栈空、栈顶   

        栈的应用:
            1.函数的调用(栈内存)
            2生产者和消费者模型
            3.表达式的解析
        栈的常见笔试面试题目:
            某个序列时入栈顺序,判断那个序列时合理的出栈顺序

       实现一个函数,判断序列b是不是序列a的出栈顺序
        bool is popstack(int *a,int* b,int len)
        {
            //创建一个栈
            //按照a的顺序一个一个入栈
            //按照b的顺序出栈
            //最后判断栈是否为空
        }

        问题:两个顺序栈,如何使用能让空间使用率最大

    队列:一个端口进,一个端口出,先进先出 FIFO
        顺序队列:
            数据项:
                储存元素的内存首地址
                容量
                队头
                队尾    接下去要入队的位置
            运算:
            创建、销毁,入队、出队、队空、队满、队头、队尾、元素个数

        顺序队列是由一维数组+队头front位置+队尾位置rear组成,入队时rear+1,出队时front+1,为了能够让队列反复使用,我们要把一维数组想象成一个环,因此
        rear、front加1后要用队列的容量求余
        rear=(rear+1)%cal;
        front=(front+1)%cal;

        如何判断队空:front==rear
        如何判断队满:
            1.front==(rear+1)%cal   代价是空一格位置不能使用
            2.添加一个数据项,标记队列是空还是满
        如何计算元素的数量:
            (rear-front+cal)%cal


        链式队列:
            由若干个节点组成的队列
            数据项:
                队头指针
                队尾指针
                节点
            运算:
                创建、销毁、队空、入队、出队、队头、队尾、数量
            

        队列的应用:
        1.消息队列
        2.树的层序遍历
        3.图的广度优先遍历
        4.封装线程池、数据池

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值