数据结构与算法
未读
数据结构是所有计算机专业的同学必学的课程
数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据
数据结构是所有计算机专业的同学必学的课程
数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据
数据结构 + 算法 = 程序
面向面试
数组
栈
队列
链表
二分搜索树
堆
面向竞赛
线段树
Trie
并查集
不要小瞧数组!
数组的基础就是把数据码成一排进行存放
12345678910111213141516171819202122232425262728293031323334package cn.shuzu;/** * * @author HQF * */public class Array { private int[] data; private int size; //构造函数,传入数组的容量capacity构造Array public Array(int capacity) { data = new int[capacity]; size ...
文件的概念
一,文件的概念
文件:记录在外部存储介质(外存)上的数据的集合。
文件的分类:
文本文件(ASCII码文件):每个字符存储到文件中。
二进制文件:以二进制存储。
C语言中对文件的存取是以字符(字节)为单位的。
文件类型指针
考试中,记住FILE就是文件类型名,它是一个结构体类型。
一个文件进行操作,通过文件指针进行的,定义如下:
FILE *fp *in *out
(指针读写后自动下移)
(打开fopen,读写,关闭fclose)
二,文件的打开(fopen()函数)格式:fopen(文件名,文件使用方式)
功能:按指定的“使用方式”打开文件,函数返回所打开文件的指针,该指针的基类型为文件类型。文件名和文件使用方式均为字符串。
如:以只读方式打开文件data.txt,并用指针变量fp指向它。
12FILE *fpfp = fopen("data.txt",FILE *fpfp = fopen("data.txt","r")
注:
文件使用方式只能用小写字母,文件名用大写或小写均一样。
如:
12FIL ...
Typedef
Typedef用typedef定义新类型名
在编程中可以用typedef来定义新的类型名来代替已有的类型名
格式:
typedef 已有类型名 新的类型名
如:typedef int INTEGER;
以后在定义变量时int和INTEGER是等价的。
INTEGER a[10],b; int a[10],b;
Typedef 已有类型名 新的类型名;
typedef可用于定义各种类型名,但不能定义变量。即只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名。
typedef只能对已经存在的类型新增一个别名,而不是创造新类型。即在typedef后必须是一个已有的类型。
位运算位运算
位运算的操作对象只能是整型或字符型数据。
C语言提供六种位运算符:
& | ^ ~ << >>
复合赋值运算符
&= , |= , ^=, <<=, >>=
[ & ]: 两个相应的二进制位都是1时,它们按位运算 ...
C语言
未读共用体中的所有成员共用同一段内存(所有成员的起始地址都是一样的)
共用体中的所有成员共用同一段内存(所有成员的起始地址都是一样的)
格式:
union 共用体名
{
成员列表;
};
注:
成员列表为定义该共用体的成员,成员定义的方式与普通变量的方式一样。
成员列表必须用一对花括号括起。
共用体名可以省略。
如:
12345678union data{ int i; //一维字符数组 char ch[10]; union data{ int i; //一维字符数组 char ch[10]; float s;};定义了一个名data的共用体类型,该类型有三个成员:i,ch,s
共用体变量的定义
先定义类型,在定义变量
定义类型的同时,定义变量
直接定义变量
123456union data{ int i; char ch[10]; union data{ int i; char ch[10]; float s;};al
注:
由于共用体类型变量的所有成员都共用同一段内存,所以公用体类型 ...
C语言
未读结构体类型
一,结构体类型
1234567struct student{ int sn; int age; char sex; int s[struct student{ int sn; int age; char sex; int s[3];};
注:
1. 定义成员的方式与定义普通变量的方式一样。
2. 成员列表必须用一对花括号括起。
3. 结构体名可以省略。
结构变量的初始化及引用
在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中,来进行对结构体变量的初始话。若初值个数多于成员个数则出错,若初值个数少于成员个数,则多余成员自动赋0.
12345struct aa{ int a; char b[10]; float c;}a1 = {30,"china",40.5},a2 = {60,struct aa{ int a; char b[10]; float c;}a1 = {30,"china",40.5 ...
如何使用C语言?
一,指针变量的定义
C语言有两种变量:
其中变量(普通变量)存储内容值;地址变量(指针变量)存储地址值。
注:
定义变量(普通变量,指针变量)都必须再前面有类型名。
在定义指针变量时,指针变量名前的“*”表示现定义的是一个指针类型的变量。星号并不是指针变量名的一部分,只有一个标志。
指针变量专门用来存地址,禁止将一个整形值直接赋给一个指针变量。
指针变量的引用
“&”取地址运算符,通过&运算符可以取出普通变量的地址。
“*”指针运算符,*可以取出指针变量所指向的普通变量的值,(间接引用普通量)
前有类型后有“*”,该星是标志。
地址变量得地址,得谁地址指向谁。
有※是内容值,不是读就是写。
无※是地址,意味着改指向。
可以通过赋值使一个指针变量“指向”某一普通变量(指针变量=&普通变量)。
在C语言中正确的做法是先让指针变量指向一个确定的存储单元后,再通过该指针变量引用它所指向的存储单元,
变量名(普通变量,指针变量)都表示其存储单元内的值。
若指针变量p指向变量a,即将变量a的地址赋给了指针变量p。
二 ...
为什么会有链表?这门技术解决了什么问题?
或许这是让每一个IT初学者很头痛的问题,明明我们在之前已经接触了数组,感到数组已经是万能的数据存储位置了,但是,如果我们一直使用比较复杂的数据(也就是比较多的数据时),我们肯定会感到很反感,因为对于数组这种数据结构,在你自己使用之前,一定要对其大小进行一番定义,这样一来,它的存储空间在数据处理过程中显得极为不方便,因为谁也不想对将要处理的数据做一个空间的预算,这是我们每一个程序员都很忌讳的,并且还要让其空间足够大,这样才能满足我们的要求(但是如果分配的太多,难免会浪费内存),上面的一切都证明使用数组需要注意的东西真的很多很多,这样一来,我们就开始说说链表,链表也是一种数据结构,它弥补了数组带来的诸多不便,让我们可以任意为一些数据进行空间的分配,根据需要进行内存单元的开辟。
而对于链表而言,分为静态链表和动态链表,根据处理数据的方向又分为单向链表和双向链表。
提到链表我们都知道还有一个比较重要的知识点就是指针,因为前后数数据要有关联,必须要进行一系列的连接和指向处理,那么扮演这个角色的就是指针,并且,在现在的编程语言中,指针是任何东西都没有 ...
C语言指针学习
1. 为什么会有指针?这门技术解决了什么问题?转载:https://blog.csdn.net/dangbai01_/article/details/79501037
(0)史前
早期的CPU(也许并没有真正的实现)并不如今天的强大,
内存读写的指令(命令)只有:
“从 常数地址0x1234 地址处读入1字节到 寄存器a”,
或者“把 寄存器b 的值写入 常数地址0x5678 这个地方”。
而如果你想清空100字节的内存,每条命令只能对内存中某一个字节进行写入,那就得写100条命令。随着要处理的数据的膨胀,程序也得跟着膨胀,而这是不可接受的。
(1)流程跳转
为了解决清空大量内存的问题,人们发明了控制流程的命令
比如“寄存器c的值为0,则跳过下一条指令” 或 “无条件跳转到首地址为0x9012”的地方,从那个地方继续运行”。
注意,命令本身也是编码成字节存在内存里的。于是就可以写选择,循环等控制语句。
(2)自修改程序
但是问题并没有解决,因为就算有了选择循环结构,整个程序还是只能写常量,所以如果想要对不同的内存块清零,只能写不同的命令。
但是人是很 ...
JavaHashMap底层原理_查找键值对过程
手动实现HashMap123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114package cn.Map;/** * 自定义一个HashMap * 实现了put方法增加键值对,并解决了键重复的时候覆盖相应的节点。 * 实现toString方法,方便查看Map中的键值对信息 * @author HQF * @param <V> * */public class TestHashMap<k,V> { Node2[] table;//位桶数组。bucket array int size; // ...
现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。
现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。
Map就是用来存储“键(key)-值(Value)对”的。Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
Map接口实现类有HashMap,TreeMap,HashTable,properties。
1234567891011//源码public interface Map<K, V> { // Query Operations /** * Returns the number of key-value mappings in this map. If the * map contains more than {@code Integer.MAX_VALUE} elements, returns * {@code In ...
LinkedList特点和底层实现
LinkedList底层用双向链表实现的存储。
特点:查询效率低,增删效率高,线程不安全。
双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。
每个节点都应该有三部分内容:
12345class Node{ Node previous; //前一个节点 Object element; //本节点保存的数据 Node next; class Node{ Node previous; //前一个节点 Object element; //本节点保存的数据 Node next; //后一个节点}
我们查看LinkedList的源码,可以看到里面包含了双向链表的相关代码:
12345678910111213141516package cn.LinkedList;public class Node { Node previous; Node next; Object element; ...
As the saying goes,”money is not almighty(全能的),but without it you can do nothing.”
25.MarchⅠ_Writing
1
A penny Saved Is a Penny Earned
As the saying goes,”money is not almighty(全能的),but without it you can do nothing.”
Therefore,we can see the importance of money in our life.Some people treasure(珍爱) it very much and believe “A penny saved Is a penny earned”(省一分钱相当于赚一分钱),so they save it.However,others think money is important just because they can exchange their money for ...

