评论

蓝桥杯算法入门第5讲:数据结构考点概述+数组+队列

关注公众号

*本文作者 罗勇军,来自公众号罗勇军算法竞赛。

前面几讲做了基础练习,熟悉了语法,提高了编码能力,思维得到了锻炼。编程起步了!

如果做过这些题后,你发现自己对编程产生了兴趣,恭喜你,后面的进步将会很快,因为你有了 主动性。竞赛最依赖主动性。

从现在开始,要学点有技术含量的编程了。

真正的编程,从学习基础数据结构开始。

蓝桥杯考点中的数据结构

蓝桥杯“第十六届蓝桥杯大赛软件赛(编程类)知识点大纲”,在大学C组、B组、A组中都有数据结构考点。

  • 大学C组

    • 考点:排序(冒泡排序、选择排序、插入排序)、搜索(bfs,dfs)、二分、高精度(数组的应用)、基础数据结构(栈、队列、链表)。

    • 对应《数据结构》课,这门课 主要有以下内容:数组、队列、链表、栈、串、二叉树、图、查找(二分、哈希等)、排序。

  • 大学B组“数据结构”专题,少量知识点出现在大三的《算法设计与分析 》课程中,但是大部分在大学课程中没有。

  • 大学A“数据结构”专题的知识点,在大学的课程中全都没有。

而且不仅是《数据结构》,蓝桥杯还有很多考点,要么是高年级课程的知识点,要么根本就不会在课程上学到,都要自学。

自学是竞赛的基本要求,所以竞赛非常依赖主动性。

算法竞赛的初学者备考蓝桥杯,要学习的知识点有一大半在《数据结构》课程中。

《数据结构》是计算机专业最核心的几门课之一。在我校《数据结构》是大一下学期的课程,有些学校是大二上学期的课程。

很多同学在大一上学期就备考蓝桥杯,显然等不及下学期才学的《数据结构》,需要先自学。

自学的时候,首先要掌握知识点,并能手写相关知识点的代码。手写代码是必须的,这样可以更好地理解知识点。

不过,做竞赛题 时需要手写队列、链表、栈这些基础数据结构吗?

竞赛题很少手写基础数据结构

竞赛有竞赛的做法!一般不用手写基础数据结构,因为可以用库函数,大大减少编码时间!

  • C++:链表list、 队列queue、栈stack。

《蓝桥杯算法入门C/C++》教材内容:

  • Python:链表、队列、栈,用 list、deque等实现。

《蓝桥杯算法入门Python》教材内容:

  • Java:链表LinkedLIst、队列Queue、栈Stack。

《蓝桥杯算法入门Java》教材内容:

数组:数据结构之母

先来练习数组题目 大家在学语言的时候肯定学过数组

数组最基础的数据 结构,数组也是 数据结构之母

  • 数组直接对应内存空间。内存是线性排列的连续空间,一个一维数组就是内存中的一段连续空间;二维数组是一维数组的“堆叠”,三维数组是二维数组的“ 堆叠”,等等。

  • 用数组可以编程实现其他所有的数据结构。例如链表、栈、队列、二叉树等等,都可以用数组来编程实现。本讲的队列手写代码是一个例子。

在C/C++和Java语言教材中,都会详细讲解数组的概念和用法。

Python的语言教材可能缺少对多维数组的描述。Python用list实现数组,例子:

# 定义一维数组a[],并初始化 a=[1,2,3,4,5] print(*a) # 打印:1 2 3 4 5 print(a[0]) # 打印:1 # 定义二维数组b[][] b=[[1,2],[4,5],[7,8]] # 定义一个3行2列的二维数组,并初始化 print(*b) # 打印:[1, 2] [4, 5] [7, 8] print(b[ 1][ 0]) # 打印:4 #定义三维数组c[][][],例如表示三维坐标c[x][y][z] c=[[[0 for _ in range(2)] for _in range (3)] for _ in range(4)] c[ 3][ 2][ 1] = 9 #对某个三维坐标赋值 print(*c) #自己试试输出 print(c[ 3][ 2][ 1]) #打印:9

数组习题

蓝桥杯题库的简单数组题目不太好找。 可以到洛谷做,有个数组的练习题单:

https://www.luogu.com.cn/training/103

队列

队列(queue)是一种简单的数据结构,是线性结构,也就是说,队列中的元素一个个排列成一条线。

队列的数据存取方式是“先进先出”:只能往队尾插入数据、只能从队头移出数据。

队列在生活中的原型就是排队,例如在网红店排队买奶茶,排在队头的人先买到奶茶然后离开,后来的人排到队尾。

队列的关键:不能插队!也不能从队伍中间离开!

编码时,定义队头head,它始终指向队列中的第一个元素,定义队尾tail,它始终 向队尾最后一个元素。

手写队列

为了深刻理解队列,需要手写代码。手写实现可以看《蓝桥杯算法入门》。

C++手写队列(Java代码类似)

constintN = 10005; //定义队列容量,确保够用 intque[N]; //队列,用数组实现 inthead = 0; //head始终指向队头。que[head]是队头 //开始时队列为空,head = 0 inttail = -1; //tail始终指向队尾。que[tail]是队尾 //开始时队列为空,tail = -1 //队列长度等于tail-head+1 head++; //弹出队头元素,让head指向新队头 //注意保持head <= tail que[head]; //读队头 que[++tail] = data; //入队:先tail加1,然后数据data入队 //注意tail必须小于N,否则溢出

Python手写队列:

n, m = map( int, input.split) que = [ i fori inrange( 1, n+ 1)] head, tail= 0, n -1#队头和队尾 whiletail - head + 1!= 0: fori inrange( 1, m ): que. append( que[head]) head += 1 tail += 1 print(que[head], end= ' ') head += 1

队列的库函数和例题

一般不用自己手写队列,而是用库函数。

    • C++:STL queue

    • Python:duque

    • Java:Queue

用下面的例题演示队列的基本用法。

约瑟夫环问题

https://www.lanqiao.cn/problems/1893/learning/

问题描述:约瑟夫环问题,即出列游戏:n个人围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出列,依次类推,直到所有的人都出列,请依次输出出列的人的编号。

输入描述:输入两个整数 n,m(1≤m,n≤100)。

输出描述:输出一行n个整数,按顺序输出每个出列的人的编号。

输入样例:

10 3

输出样例:

3 6 9 2 7 1 8 5 10 4

思路:约瑟夫问题是一个经典问题,可以用队列、链表等数据结构实现。用队列模拟报数:方法是反复排队,从队头出去,然后重新排到队尾,每一轮数到m的人离开队伍。

C++代码

# include<bits/stdc++.h> usingnamespacestd; intmain{ intn,m; cin>>n>>m; queue< int>q; for( inti= 1;i<=n;i++) q.push(i); while(!q.empty){ for( inti= 1;i<m;i++){ q.push(q.front); //读队头,重新排到队尾 q.pop; //弹走队头 } cout<< q.front << " "; q.pop; //第m个人离开队伍 } cout<< endl; return0; }

Python代码

fromcollections importdeque n, m = map(int, input.split) q = deque fori inrange( 1, n + 1): q.append(i) whileq: for_ inrange( 1, m): q.append(q.popleft) # 读队头,重新排到队尾 print(q.popleft, end= " ") # 第m个人离开队伍 print

Java代码

importjava.util.LinkedList; importjava.util.Queue; importjava.util.Scanner; publicclassMain{ publicstaticvoidmain(String[] args){ Scanner sc = newScanner(System.in); intn = sc.nextInt; intm = sc.nextInt; Queue<Integer> q = newLinkedList<>; for( inti = 1; i <= n; i++) q.offer(i); while(!q.isEmpty) { for( inti = 1; i < m; i++) { q.offer(q.peek); //读队头,重新排到队尾 q.poll; } System.out.print(q.peek + " "); q.poll; //第m个人离开队伍 } } }

队列习题

蓝桥杯题库:

https://www.lanqiao.cn/problems/

CLZ银行问题1113、模拟队列19878、电子产品加工8486、小桥的神秘礼物盒3746、机器翻译511

------------------------返回搜狐,查看更多

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()