• 最新文章
  • C++基础
  • 基础算法
  • 数据结构

[置顶]网站纪要及“食用”说明

欢迎大家来到《C++算法宝典》 目前正在更新中,由于由于排序问题,虽然几乎每天都在更新,但并不会置顶,如果有小伙伴觉得更新慢,可以随时催更!!! 在一个吉利的日子,搭建本教程网站。 截止到7月8日,共更新了38篇CSP-J阶段的知识,暂时还未涉及到提高组的算法知识,敬请期待~ 系统学习请点击分类,比如c++基础、基础算法、数据结构 想看下一个教程,请在文章底部点击上一篇「因为是按时间顺序排序的,进

数据结构01 栈及其应用

数据结构是一种在程序中系统化管理数据集合的形式。它通常由以下3个概念组合而成: 数据集合:通过对象数据的本体(例如数组和结构体)保存数据集合 规则:保证数据集合按照一定规矩进行正确操作、管理和保存的规则(例如按照顺序取出数据) 操作:增、删、改、查等对数据集合的操作 我们今天主要讲解的是栈(Stack)的操作 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为“栈顶”,

数据结构02 队列及其应用

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,前端一般叫做队头,后端叫队尾。队列就像学校做操站队一样,来的人一个一个往后站,走的时候从前往后一个一个走。 总结队列的特点为:先入先出,即先入队的元素先出队。 对于队列的使用,我们可以直接利用数组来模拟队列的基本操作,具体实现如下: int que;     //定义一个能存放10

数据结构03 链表及其操作

链表的种类较多,这里我们主要讲解最常见的带头结点的单链表。 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。   如图所示,链表中每个数据的存储都由以下两部分组成: 1.数据元素本身,其所在的区域称为数据域; 2.指向直接后继元素的指针,所在的区域称为指针域;   1.头结点:头节点是一个不存储任何数据的结点,是为了方便找到链表位置。 2.首元结点:它是链

数据结构04 动态数组vector

vector翻译为向量,但是这里使用“变长数组”的叫法更容易理解,也即“长度根据需要而自动改变的数组”。 在考试题中,有时会碰到只用普通数组会超内存的情况,这种情况使用vector会让问题的解决便捷许多。 另外, vector还可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)、又害怕使用指针实现邻接表的读者是非常友好的写法也非常简洁。   如果typename 是vector

算法01 递推算法

递推是一种处理问题的重要方法。 递推通过对问题的分析,找到问题相邻项之间的关系(递推式),从起点出发(首项或者末项)然后使用循环不断地迭代,得到最后需要的结果。 对于Fibonacci数列,已知:fib(1) = 1; fib(2) = 1; 从第三项开始满足公式fib(i) = fib(i-1) + fib(i-2)。输入一个整数n(1<=n<=100),求fib(n)的值。 【输入

算法02 递归算法

在编程中,我们把函数直接或者间接调用自身的过程叫做递归。 递归处理问题的过程是:通常把一个大型的复杂问题,转变成一个与原问题类似的,规模更小的问题来进行求解。 函数的参数。在用递归解决问题时,要合理地去设计函数的参数,达到当前问题与子问题之间的变化,可以通过参数进行准确地描述。 递推关系。要能够找到当前问题与子问题之间的联系,能够用子问题去描述当前问题的解。 递归出口(边界条件)。要找到问题的边界

算法03 模拟算法之一维数组相关内容详解

模拟算法就是模拟题目给的操作,用代码一步一步的描述出来即可。在过程中使用的都是我们已知的各种方法,如数组元素调用、排序、枚举等等,只是这些过程一般比较复杂。本次课程主要针对一维数组的模拟。 在各类算法竞赛中,包括CSP-J/S,NOIP等竞赛,经常会出现各类“模拟题目”,遇到这种题大家不需要害怕,甚至可以将其作为“送分题”,因为你只需要按照题目叙述的方式来写程序就能得到最终答案。模拟不是一种算法,

算法04 模拟算法之普通二维数组相关详解

直接来训练下普通二维数组的题目。 给定一个m行n列的矩阵,求矩阵外围元素之和。所谓矩阵外围的元素,是矩阵第一行、最后一行、第一列和最后一列的所有元素。 【输入描述】第1行:为两个整数,分别表示矩阵的行数m和列数n,中间以一个空格间隔; 接下来m行为该矩阵m行n列的元素,且都为整数,每一行元素之间以一个空格隔开。 【输出描述】一个整数,表示该矩阵外围元素之和。 【样例输入】 3 4 1 2 2 1

算法05 贪心算法

贪心算法(greedy algorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响。 可想而知,并不是所有的时候贪心法都能获得最优解,所以一般使用贪心法的时候,都要确保自己能证明其正确性。   贪心算法有两种证明方法:反证法和归纳法。一般情况下,一道题只会用到其中的

算法06 二分查找

二分查找又称为折半查找,主要用于查找一个有序数组中某一个数的位置。 主要思想如下: 在一个有序数组中,取数组的中间值与要查找的数进行比较; 若要查找的数等于中间值,查找成功。   若要查找的数大于中间值,则在右半区间继续取中间值与要查找的数进行比较; 若要查找的数小于中间值,则在左半区间继续取中间值与要查找的数进行比较; 直至最后要查找的数未出现过与中间值相等的情况,查找失败  

算法07 深度优先搜索

现在有一个3*3的迷宫,小知在迷宫的左上角,迷宫出口在右下角,请你帮小知算一算,他有多少种方案可以走出迷宫(每个格子不能重复走动)。 迷宫中显示0的点,是不可以走的。小知每次只能到达相邻的上下左右4个格子。 1.如果当前出发的格子是终点,则程序结束。 2.每次可以选择的格子有:上(A)、下(B)、左(C)、右(D)。 3.按照顺序尝试每个格子是否可走。 4.找到第一个可以走的格子(假设为B),标记

算法08 广度优先搜索

现在有一个4*4的迷宫,小知在迷宫的左上角,迷宫出口在右下角,小知体力有限,他希望尽快走出迷宫,请你告诉小知最少需要走多少步(每个格子不能重复走动)。 迷宫中显示0的点,是不可以走的。小知每次只能到达相邻的上下左右4个格子。 我们可以按照这样的思路去找: 从起点出发,检查第1步可以到达的所有点,判断是否为终点。 依次从第1步到达的点出发, 检查判断第2步可以到达的点是否为终点。 依次从第2步到达的

算法09 模拟算法之日期模拟

无论是中小学编程竞赛还是大学生编程竞赛,日期模拟都是经常会出现的题目。 日期模拟经常会出现以下题型: 得到某年某月的天数 判断给定日期的合法性 给定年份,求这一年第n天的日期 给定年月日,求经过n天后的日期 查找两个日期之间有多少个回文日期... ...   得到某年某月的天数问题经常会作为其他问题的模板来使用。 首先我们需要存储一年中所有月份相对应的天数 int day = {0,31,28

C++基础01 C++基本框架

C++语言,是基本的程序设计语言之一【程序设计语言,简单的来说就是编写代码来操控计算机实现某种功能的语言。】,有很多大家经常会玩的游戏都是有C++语言参与的,比如植物大战僵尸以及英雄联盟中的部分代码都用到了C++语言。 打开devcpp软件(点击此处获取devcpp编程软件)从主菜单选择“文件”—>“新建” —>“源代码”即可。新建完成之后屏幕右下侧出现一片白色区域,称为“源程序编辑区

C++基础02 输出语句与分隔

标准输出指令:cout 标准使用格式:cout << 指令功能:在控制台输出结果,如果想要原样输出我们想让他显示的内容,那么就需要将原样输出的内容用双引号引起来。 小知学习完cout语句之后,希望利用自己所学知识来告诉老师自己现在的位置在哪里?聪明的你能帮助小知完成这个简单的任务吗? 【样例输入】无 【样例输出】广东省深圳市 #include <iostream> usin

C++基础03 变量

变量,代表了一个存储单元,其中的数量是可以改变的 ,所以我们把它称为变量,通俗的说,变量就类似于一个房间,我们可以往房间里面放不同数量的椅子。 定义格式:变量类型  变量名; 变量类型也就是规定变量里能放什么类型的数据,比如整数,小数等等。 例如,现在需要定义一个能存放整数的变量,名字叫a,那么 这里可以写成:int a; 这里的int表示变量a里只能放整数数字。 定义多个变量:将多个变量名之间用

C++基础04 输入语句

使用格式:cin >> 输入的意思就是把一个值放到变量里面去,也就是变量的赋值,这个值是由我们自己输入的。 (注意:输入变量前要先定义,输入完之后要按Enter键。) 输入多个变量,与输出类似,用”>>”连接即可。 例:如果我要向定义好的整型变量a里面输入数字,则 可写成: cin>>a; 小知书架内的书总是被他借给别人,所以他也不能确定书架内还有多少本书,今天

C++基础05 浮点型/实数类型

实数类型是一种数据类型,实数类型变量里能存放小数和整数。 定义格式:double a; 赋值:a=0.4; 输入:cin>>a; 输出:cout<<a; 小知在文具店买铅笔,一枝铅笔的价格是0.8元。请你帮助小知,用变量的形式输出这枝铅笔的价格。 【样例输入】无 【样例输出】0.8 #include <iostream> using namespace std;

C++基础06 格式化输出

格式化输出所用的函数为 printf,它可以输出任意位数的小数。 使用格式:printf(“%.nf”,a)。这句话的作用是将变量a保留n位小数输出。 注意事项: 1、这里的n,需要具体化为一个数字,保留几位小数,如保留两位小数,n就改成2,保留三位小数,n就改成3; 2、%后面的小数点一定不能漏掉。 3、使用printf的时候,一定要注意加上头文件#include<cstdio>。

C++基础07 程序中的除法和求余

int / int = int double / int = double int / double = double double / double = double 只要除号任意一边出现了double类型,结果就是double类型 只有除号两边都是int类型,结果才是int类型 这个规律也适用于加法减法和乘法 小知妈妈早上出去买了n块饼作为早餐,准备回家跟小知爸爸还有小知平均分掉吃,请问每个人

C++基础08 强制类型转换

强制类型转换,就是把一种数据类型转化为另一种指定的数据类型。 它是一种临时的转换。 格式:(数据类型) (表达式) 即:(要被转换成的类型)(被转换的式子); 注意:类型名或者表达式至少要有一个被括号括起来。 例如:输出5/2的小数结果,可以这么写: int a=5;   cout<<(double)a/2; 这么写就相当于先把a转化成double类型,再除以2。这样的话与5.0/2的

C++基础09 字符类型和ASCII码

如果我们想存字母,例如输入k,能输出k,就需要声明字符类型的变量来存放。 字符是指计算机中使用的字母、数字和符号。例如我们26个大小写字母、数字0~9、和一些特殊的符号“#”、“@”、“+”、“-”等等。 字符类型(char)是一种数据类型,和实数类型、整型类似,不同的是一个字符类型变量可存储的内容为单个字符。 定义格式:char  a;   // (数据类型) (变量名) 赋值:a = 'k';

C++基础10 变量连续赋值、自增自减

当很多个变量都需要给一个相同的值的时候,我们可以用连续的赋值符号完成这个操作。 基本格式:变量=变量=变量=……=变量=表达式; int  a,b,c,d,e; a=b=c=d=e=88; 完成的功能是将88这个数值赋给a,b,c,d,e这五个变量。而在程序内部执行的顺序如下: e=88;   d=e;  c=d;   b=c;   a=b; 小知邀请三个小伙伴来家做客,妈妈刚好买回来一袋糖果准备

C++基础11 复合运算符与变量交换

在c++中,有很多方便书写的复合运算符,用的比较多的有如下几个: += 、 -= 、*= 、 /= 、 %= 。 例如: a+=b;  就是把变量a的数值增加b。其他运算符与之类似。 a=b就是把b的值赋值给a了,这样a的值变成了4,之后b=a,b的值也变成了4。 就像有两杯饮料,我们要交换两个杯子的饮料,直接把一个杯子往另一个杯子里倒肯定是不行的,这时需要一个多余的空杯子来过渡。 这里我们也需要