<span>数据结构基础</span>

数据结构基础

数组偏移量

数组分为一维数组、二维和多维,现在就以1-3维数组为例进行介绍(在软考中只涉及到了1-3)

  • 一维数组:a[n]
    • 对于一维数组,它的偏移量计算特别简单,比如在a[10]中求a[4]的偏移量
    • ① 数组a的下标从0开始,则偏移量为4
    • ② 数组a的下标从k开始(k<=4,保证所求元素在数组中)则偏移量d=4-k
  • 二维数组:a[m][n]
    • 对于二维数组,它的偏移量计算分为以行为主序和以列为主序存储。以a[0…4][1…5]为例,计算a[2,2]的偏移量
    • ① 以行为主序:偏移量d=in+j(i,j下标从0开始),以上述为例,由题可知,j的下标是以1为起始,则此时的偏移量为:d=25+(2-1)=11
    • ② 以列为主序:偏移量d=j*n+i(i,j下标从0开始)此时偏移量d=(2-1)*5+2=7
  • 三维数组:a[m][n][o]
    • 三维数组计算a[i][j][k]的公式为d=ino+j*o+k
    • 例如:数组a[0…3,0…2,1…4],求a[2,2,2]的偏移量,则可求得d=234+2*4+(2-1)=33

线性表

  1. 线性表
    定义: 线性表是n个元素的有限序列,通常记为(a1,a2,…,an)。
    特点:
    • 存在惟一的表头和表尾。
    • 除了表头外,表中的每一个元素均只有惟一的直接前驱。
    • 除了表尾外,表中的每一个元素均只有惟一的直接后继。
  2. 线性表的存储结构
  • 顺序存储

    • 是用一组地址连续的存储单元依次存储线性表中的数据元素,从 而使得逻辑关系相邻的两个元素在物理位置上也相邻。
    • 优点:可以随机存取表中的元素
    • 缺点:插入和删除操作需要移动大量的元素。
    • 在线性表的顺序存储结构中,第i个元素ai的存储位置为:LOC(ai)= LOC(a1)+(i-1)×L
    • 其中LOC(a1)是表中第一个元素的存储位置,L是表中每个元素 所占空间的大小。
  • 链式存储

    • 链式存储是指用结点来存储数据元素,结点的空间可以是连 续的,也可以是不连续的,因此存储数据元素的同时必须存储元素之间的逻辑关系。 结点空间只有在需要的时候才申请,无须事先分配。
    • 优点:插入和删除操作不需要移动元素,操作方便。
    • 缺点:增加了存储空间开销,不能随机访问任一结点
  • 其他几种链表结构

    • (1)双向链表:每个结点包含两个指针,指明直接前驱和直 接后继元素,可在两个方向上遍历链表。
    • (2)循环链表:表尾结点的指针指向表中的第一个结点,可 在任何位置上开始遍历整个链表。
    • (3)静态链表:借助数组来描述线性表的链式存储结构。
  • 线性表的插入和删除运算

    • (1)基于顺序存储结构的运算
      插入元素前要移动元素以挪出空的存储单元,然后再插入元素: 删除元素时同样需要移动元素,以填充被删除出来的存储单元。
    • (2)基于链式存储结构的运算
      在链式存储结构下进行插入和删除,其实质是对相关指针的修改。

  1. 栈是只能通过一端来实现数据存储和检索的一种线性表。
  2. 栈进行插入和删除操作的一端称为栈顶,另一端称为栈底。
  3. 栈的修改是按先进后出的原则进行的。又称为先进后出的线性表。
  4. 栈的存储结构
  • 栈的存储结构有顺序存储和链式存储。
  • 栈的顺序存储是指用一组地址连续的存储单元依次存储自 栈顶到栈底的数据元素,同时附设指针top指示栈顶元素的位置。
  • 用链表作为存储结构的栈也称为链栈。由于栈中元素的插入和删除仅在栈顶一端进行,因此不必设置头结点,链表的头指针就是栈顶指针。

队列

  • 队列是一种先进先出(FIFO)的线性表,它只允许在表的一端插 入元素,而在表的另一端删除元素。 在队列中,允许插入元素的一端称为队尾(rear),允许删除元 素的一端称为队头(front)。
  • 队列的存储结构
    • 队列的存储结构有顺序存储和链式存储两种。
    • 队列的顺序存储结构是利用一组地址连续的存储单元存放 队列中的元素。由于队列中元素的插入和删除限定在队列 的两端进行,因此设置队头指针和队尾指针,分别指示当 前的队首元素和队尾元素。
    • 用链表表示的队列简称为链队列。
    • 为了便于操作,给链队列添加一个头结点,并令头指针指 向头结点。队列为空的判定条件是:头指针和尾指针的值相同,且均指向头结点。

  • 串是仅由字符构成的有限序列,是取值范围受限的线性表。
    一般记为S=‘a1 a2…an’,其中S是串名,a1a2…an是串值。
  • 串的几个基本概念
    • 空串:长度为零的串,空串不包含任何字符。
    • 空格串:由一个或多个空格组成的串。
    • 子串:由串中任意长度的连续字符构成的序列。含有子串的串称为主串。子串在主串中的位置指子串首次出现时, 该子串的第一个字符在主串中的位置。空串是任意串的子串。
    • 主串:abcbcc
    • 子串:cb
    • 串相等:指两个串长度相等且对应位置上的字符也相同。
    • 串比较:两个串比较大小时以字符的 ASCII码值作为依据。比较操作从两个串的 第一个字符开始进行,字符的ASCII码值大 者所在的串为大,若其中一个串先结束, 则以串长较大者为大。
  • 串的存储结构
    • 每个字符串的最后要增加个串结束标志 \0 。
    • 串的顺序存储用一组地址连续的存储单元来存储串值的字符序列。
    • 串的链式存储当用链表存储串中的字符时,每个结点中可以存储一个字符,也可以存储多个字符,要考虑存储密度问题。
全部评论

相关推荐

2025-12-24 15:25
已编辑
门头沟学院 前端工程师
是腾讯的csig腾讯云,前天晚上九点突然打电话约面,激动的通宵学了一晚上,第二天状态很差改了今天(以后再也不通宵学习了)感觉自己浪费了面试官一个半小时单纯手写+场景,无八股无项目无算法,打击真的很大,全是在面试官提醒的情况下完成的,自己技术方面真的还是有待提高,实力匹配不上大厂和已经面试的两个公司完全不一样,很注重编码能力和解决问题的能力,然而我这两个方面都很薄弱,面试官人很好很耐心的等我写完题目,遇到瓶颈也会提醒我,写不出题也会很耐心的跟我讲解好感动,到最后面试结束还安慰我打算把下周最后一场面试面完之后就不面啦,如果能去实习还是很开心,但是最重要的还是好好努力提高技术以下是面经第一题//&nbsp;实现一个解析&nbsp;url&nbsp;参数的函数function&nbsp;parseUrl(urlStr)&nbsp;{//&nbsp;TODO}parseUrl('*********************************************');//&nbsp;返回&nbsp;{a:&nbsp;1,&nbsp;b:&nbsp;2,&nbsp;c:&nbsp;3}追问:在链接里见过什么部分?用&nbsp;hash&nbsp;路由的话放在哪第二题//&nbsp;考虑有一个异步任务要执行,返回&nbsp;Promise,这个任务可能会失败,请实现&nbsp;retry&nbsp;方法,返回新方法,可以在失败后自动重试指定的次数。/***&nbsp;异步任务重试*&nbsp;@param&nbsp;task&nbsp;要执行的异步任务*&nbsp;@param&nbsp;times&nbsp;需要重试的次数,默认为&nbsp;3&nbsp;次*/function&nbsp;retry(task,&nbsp;times&nbsp;=&nbsp;3)&nbsp;{//&nbsp;TODO:&nbsp;请实现}//&nbsp;---------------测试示例&nbsp;----------------//&nbsp;原方法const&nbsp;request&nbsp;=&nbsp;async&nbsp;(data)&nbsp;=&gt;&nbsp;{//&nbsp;模拟失败if&nbsp;(Math.random()&nbsp;&lt;&nbsp;0.7)&nbsp;{throw&nbsp;new&nbsp;Error('request&nbsp;failed');}const&nbsp;res&nbsp;=&nbsp;await&nbsp;fetch(&#39;https://jsonplaceholder.typicode.com/posts&#39;,&nbsp;{method:&nbsp;'POST',body:&nbsp;JSON.stringify(data),});return&nbsp;res.json();}//&nbsp;新的方法const&nbsp;requestWithRetry&nbsp;=&nbsp;retry(request);//&nbsp;使用async&nbsp;function&nbsp;run()&nbsp;{const&nbsp;res&nbsp;=&nbsp;await&nbsp;requestWithRetry({&nbsp;body:&nbsp;'content'&nbsp;});console.log(res);}run();第三题就是给&nbsp;retry&nbsp;函数添加类型注释,用到泛型第四题:在组件库中将&nbsp;Alert&nbsp;用&nbsp;api&nbsp;的形式实现(应该就是&nbsp;message&nbsp;这个组件)怎么渲染到一个浮层里而不是原地渲染出来
不知道怎么取名字_:技术这个东西,太杂了,而且要下功夫的
查看5道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务