- 博客(26)
- 收藏
- 关注
原创 小项目-词法分析器
一个完整的编译器,大致会经历如下几个阶段各个阶段的职责,简单描述如下:词法分析:对源文件进行扫描,将源文件的字符划分为一个一个的记号(token) (注:类似中文中的分词)。语法分析:根据语法规则将 Token 序列构造为语法树。对语法树的各个结点之间的关系进行检查,检查语义规则是否有被违背,同时对语法树进行必要的优化,此为语义分析。遍历语法树的结点,将各结点转化为中间代码,并按特定的顺序拼装起来,此为中间代码生成。对中间代码进行优化将中间代码转化为目标代码。
2024-04-23 10:02:20
579
1
原创 虚拟机扩容方法
我的虚拟机开始的内存是40G,接下来要扩成60GB点击编辑虚拟机设置将硬盘容量扩容为所需容量开启虚拟机,打开终端,输入两条终端命令在磁盘分配器中将扩展的内存分配随后点击对号应用,即可完成扩容。
2024-04-20 00:18:06
324
1
原创 王道短期班c++ day09
out:做写操作,清空流的内容,当文件不存在时,会直接创建新文件,并写如数据,当文件存在时,会清空文件流的内容。ifstream文件输入流/ofstream文件输出流/fstream文件输入输出流。app:写操作,只能在末尾追加写(不管文件游标在哪里,都只会在文件末尾写入)ate:文件指针偏移到文件流的末尾,配合读操作。文件I/O:内存与外部文件之间的信息的传递。trunc:打开文件时,清空流的内容。binary:以二进制方式打开文件。动态查看某一个文件中的最新内容。$tail -F 文件名。
2024-01-10 20:42:03
451
原创 王道短期班c++ day08
标准输入流对象 类ostream cuot;1.调用一个operator new库函数开辟未类型化的空间 void* operator new(size_t);字符串IO:类istringstream、类ostringstream、类stringstream。1.不能创建栈对象,只要构造函数和析构函数中的某一个放在private区域即可。文件IO:类ifstream、类ofstream、类fstream。一个类只能创建在栈上的对象,不能创建位于堆上的对象。一个类只能创建堆上的对象,不能创建位于栈上的对象。
2024-01-10 16:39:59
419
原创 王道短期班C++ day07
使用增强for循环访问字符串的每一个元素,auto自动推断类型,&引用符号访问s1中的每一个元素,如果不加&,那么会对元素进行复制。c++兼容c库函数的接口,使用str.c_str()将字符串强转为char*类型。获取字符串的长度 str.size()/str.length()截取字串 str.substr(开始位置,要截取的字符个数)字符串本质就是数组,可以用for循环访问字符串的每一个元素。在c++里使用string要导入头文件。
2024-01-09 16:13:12
381
原创 王道短期班c++ day06
this指针代表的就是当前对象本身,是作为成员函数的第一个隐含的参数,编译器在编译时会自动加上,不需要程序员手动提供this指针不可以被修改this指针作为隐含参数。
2024-01-09 11:47:26
1108
原创 王道短期班c++ day05
面向过程:通过一个一个过程的推动导致状态发生变化面向对象:N个对象之间的交互导致其状态发生变化在面向对象的世界里,要抽象出对象的类(class,类似于结构体),即对象的共同特征,例如人这种对象,就可以抽象出身份证号,性别,年龄,身高,体重等等。
2024-01-08 20:03:57
1268
1
原创 王道短期班c++ day04
inline函数是在一个函数的返回类型之前加上inline关键字,则该函数就会变成一个inline函数,inline函数会在编译期讲函数体的内容替换掉,而不是直接调用函数,功能与带参数的宏定义相同,程序执行效率更高(函数调用是有开销的)函数重载的具体步骤:当函数名相同时,根据参数的类型,顺序,个数进行名字改变。当默认参数在函数声名时已经设置过,那么在函数定义时不需要重复给出,否则报错。执行结果发现c语言执行函数没有进行名字改写,而c++进行了名字改写。每一个进程在运行时都有一个地址空间:虚拟地址空间。
2024-01-02 20:00:20
413
原创 王道短期班c++ day03
全局变量可以做外部变量,静态变量只可以在本模块内部使用(变量名不可以相同,否则会发生冲突,可以把全局变量理解成本模块对外的接口)指针所指的值不可以修改 执行*p=xxx;引用可以作为函数参数,采用引用传递的优势:没有复制的开销,提高程序的执行效率(值传递的本质就是进行复制)因为指针太过灵活,使用容易出错,因此c++提出了引用,引用是一个变量的别名(类似于一个人的小名)4.maloc的返回值是void* new 的返回值是相应类型的指针。指针数组是数组 int *p[], 是一个数组 存放的元素是指针。
2023-12-30 17:20:36
403
1
原创 王道短期班c++ day02
x删除光标位置所在的字符 dd删除光标所在行(相当于剪切,按p就会粘贴刚才删掉的行) ndd删除光标所往下的n行 dnG删除从光标所在行到第n行 dw 从光标所在位置删除一个单词 dnw 从光标所在位置删除n个单词。:建立文件1和文件2的软连接(软连接两个文件的引用计数不变,12月前面的数字表示的不是大小,而是软连接文件的长度)yy 复制光标所在的行 nyy复制光标所在的行往下的n行 ynG复制光标所在的行到n行的内容。:建立两个文件的硬链接(建立硬连接的两个文件是同一个文件)
2023-12-29 19:41:58
950
1
原创 王道短期班c++培训 day01
剩余九个字母每三位表示一种用户的权限,r表示可读 w表示可写 x表示可执行 -表示什么操作都不允许,三种操作可以分别用二进制01表示,例如0表示不可读 1表示可读,把一类用户权限用二进制表示,例如101,即可读不可写可执行,转换为十进制就是5,用三位十进制表示三类用户的权限 例如770表示当前用户可读可写可执行,组用户可读可写可执行,其他用户不可读不可写不可执行(这个会在以指定权限的方式创建目录以及改变用户权限哪里用到)第一列首字母表示文件类型 d表示该文件为目录文件 l表示该文件为软连接文件(快捷方式)
2023-12-28 20:32:04
1202
2
原创 代码随想录算法训练营第十五天|102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树
使用队列辅助完成层序遍历,先将根节点入队,然后进行循环处理,一直处理到队列为空为止,处理的逻辑为,首先获取队列元素的个数(这个操作的含义为,统计当前层有多少个元素),然后对这些元素进行处理,每个元素的处理逻辑为先访问该节点,然后看他的左孩子是否为空,是入队,不是看右孩子是否为空,是就入队,不是处理下一个元素,直到这些元素处理完,说明处理完一层,就该处理下一层了,逻辑同上,直到队列为空,也就是所有层都处理完了,完成层序遍历。
2023-08-10 00:24:39
182
1
原创 代码随想录算法训练营第十四天|144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历
使用栈模拟递归函数的过程,根据先序遍历的根左右规则,以及栈先进后出的特性,可以总结出,遍历一个节点的时候,先处理根节点,然后先让右节点入栈,再让左节点入栈 (然后出栈的时候就变成左右了)就算是吧一个节点处理完了,然后每个节点都这么处理就完成遍历了。使用非递归实现前序遍历的逻辑,区别在于前序遍历的时候是先访问根再让右孩子先入栈,左孩子后入栈,后续遍历则是先访问根再让左孩子先入栈,然后右孩子入栈,这样得到的顺序为根右左,然后对这个结果进行逆置即为左右根,便得到了后序遍历的序列。//非递归实现前序遍历。
2023-08-08 20:02:06
157
原创 代码随想录算法训练营第十三天|239.滑动窗口最大值、347.前k个高频元素
有一个暴力解法,即每次都把滑动窗口遍历一次,然后求出来最大值,然后滑动窗口移动一位,再把滑动窗口遍历一次,可以是可以,但是时间复杂度为o(n*k) 时间复杂度很高,这时候又想到,大根堆具有把数组中的最大值放在首位的优秀性质,但是使用大根堆又会出现一个问题,那就是大根堆会调整滑动窗口各个元素的位置,每次是求出来最大值了,但是每次出队的元素就错掉了,只有第一次能求对,后面都错了,因为出队出错元素了,那么该怎么办,可以把大根堆的优秀性质借鉴过来,去除其不满足题意的点,那是什么呢?// 定义一个小顶堆,大小为k。
2023-08-08 00:40:31
107
原创 代码随想录算法训练营第十一天|20.有效括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式
碰到数字就直接压入栈,碰到运算符,就弹出栈顶元素和次栈顶元素(做次栈顶元素 操作符 栈顶元素 操作)然后将运算结果再压入栈中,问题,如何判断扫描到的字符是数字还是运算符?使用栈,依次扫描字符串,碰到左括号就入栈,碰到右括号就与栈顶元素匹配,如果匹配,那么就继续扫描,如果不匹配,那么直接返回false,如果扫描到右括号,但是栈为空,则匹配失败,如果扫描完字符串,栈仍然不为空,那么匹配失败,如果扫描完字符串,而且栈为空,匹配成功,//时间复杂度为o(n) 空间复杂度为o(n)150.逆波兰表达式。
2023-08-08 00:28:28
207
原创 代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈
使用两个栈来实现队列,一个栈s1用于入队,一个栈s2用于出队,具体实现过程为:当有元素入队时,只需要直接将元素压入s1即可,出队时,如果s2为空,则把s1中的元素全部压入s2,弹出s2栈顶元素,否则,直接弹出栈顶元素,读取栈顶元素类似,只不过不需要弹出栈顶元素,只需要获取栈顶元素的值,判断队列是否为空之需要判断s1和s2是否都为空,是那么队列为空,不是那么队列不空。出栈操作:进行n-1次出队后在入队的操作,就把待出栈元素放在队头了,然后出队即可。判空:如果队列为空,栈为空,否则栈不为空。
2023-08-04 18:53:46
77
1
原创 代码随想录算法训练营第九天|28.找出字符串中第一个匹配项的下标
需要注意的是,因为并不是回退一次就相等了,可能一直都不相等,直到退到模式串最初的位置,所以不可以用。理论还可以,手算next数组也会算,但是用代码实现确实还有点懵,后续仍然需要多多复习。的数组的值指的是当在这个位置发生不匹配,即冲突的时候,模式串的指针应该跳到那个位置。数组,匹配串的指针不需要回退了,算法效率得到很大优化。的操作,所以最长相等的前后缀的长度可以为负数,原本是。不相等,说明遇到了前后缀不相等的情况,需要回退。)最长相等的前后缀的长度,所以。处理前后缀不相等的情况,说明遇到了相同的前后缀,
2023-08-03 17:41:33
85
原创 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串II、剑指Offer 05.替换空格、151.反转字符串里的单词、剑指Offer58-II.左旋转字符串
344.反转字符串344.反转字符串代码随想录(programmercral.com)字符串基础操作! | LeetCode:344.反转字符串思路直接把字符串看作线形表的顺序存取结构,反转字符串相当于逆置数组。代码实现class Solution {public: void reverseString(vector& s) { //直接当做数组处理,相当于逆置数组 int i=0,j=s.size()-1; while(i
2023-08-03 00:23:07
89
原创 代码随想录算法训练营第七天|454.四数相加II、383.赎金信、15.三数之和、18.四数之和
因为这种题也可以归结为在某个集合中找某个元素是否出现过,关键在于考虑到如何降低运算量,四个数组运算量太大,所以这个题可以归结为两个数组的操作,即nums1和nums2是一种,把他俩相加所有的可能存入哈希表,然后nums3和nums4是一种,他俩相加所有的可能的相反数就是需要在哈希表中寻找的元素,为什么是相反数,因为设nums1数组元素是a,nums2的元素为b,以此类推,有c和d,那么哈希表中存放的元素为a+b,那么要满足a+b+c+d=0,即要找的元素是0-c-d,即c+d的相反数。去重操作,怎么去重?
2023-08-02 00:16:47
147
原创 代码随想录算法训练营第六天|242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
因为字母一共有26个,并且字母的ascii码也是连续的,集合大小有限,就可以考虑用数组实现哈希表,(如果要求集合内没有重复值,可以用set,集合内元素一个key对应一个value,可以用map),初始化一个长度尾26的数组,其中索引下标为0的元素对应于a,索引下表为1对应元素b以此类推(具体怎么对应?显然是要判断数组2中的元素有没有在数组1中出现过,由此可以得出结论,使用哈希表做,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。今天的四个题都有难度,算是吧哈希表的三种类型给入了门了,
2023-08-01 01:05:28
175
2
原创 代码随想录随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面积题 02.07.链表相交、142.环形链表II
要找环的入口,所以要找x和yz的对应关系,化解等式得x=n(y+z)-y,因为快指针和慢指针相遇的时候肯定在环里转过1圈以上了(至于为什么可以理解为慢指针被快指针套圈了,套圈意味着他肯定以及跑了一圈以上了),n又代表快指针转了多少圈,所以可以让快指针让出来一圈得到。思路:只需要搞清楚当前操纵的是那个节点,理清楚什么时候该退出循环(当p的下个节点为空时,说明全部都交换完了),同时因为是两个节点两个节点处理的,所以链表节点个数为奇数的话,需要做一些单独的处理,即要最后一个节点插在处理完的链表尾。
2023-08-01 00:41:46
220
1
原创 代码随想录算法训练营第三天|203.移除链表元素 707.设计链表 206.反转链表
然后把p->next指向pre,p向后走,pre向后走,直到p指向空,说明所有的元素都处理了一遍,整个链表反转完成,pre指向的就是新的头节点。此外,需要注意的是,这里所说的头节点和考研中所学的头节点是两个概念,这里的头节点是指链表的第一个节点,对应于考研中不带头节点的链表,这里所插入的虚拟头节点对应于考研中的头节点,此外掌握c++语法,如何新建一个节点,使用关键字new 例如ListNode *head = new ListNode(头节点的值)//p=p->next;//两个指针向后移动。
2023-07-29 00:19:24
570
原创 代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵(二)
当起始位置到终止位置这个区间内的元素的和比target大的时候就可以调整起始位置了,向后移动一位,这个时候再看起始位置到终止位置这个区间的元素和还比target大不大,如果还大就一直调整,边调整边更新滑动窗口的长度,最后取滑动窗口长度最小的值)逐渐调整终止位置,直到终止位置遍历完一遍数组,这个时候取出滑动窗口的最小值即为所得结果。//第二圈开始的时候,起始位置要各自加1,eg:第一圈的起始位置是(0,0)第二圈的起始位置应该是(1,1)//因为相当于去掉窗口中的第一个元素了,所以这里的和要减掉。
2023-07-28 00:41:03
636
原创 代码随想录算法训练营第一天|704.二分查找、27.移除元素
代码随想录手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找状态:明白理论,但是代码实现出现了一堆问题leetcode从的704题是一道原汁原味的二分查找法的题目,比较容易,注意二分查找的前提条件是有序顺序数组,且对于边界条件的处理,即究竟使用的是左闭右闭的区间还是使用的左闭右开的区间,都有不同的处理策略。第一种写法是定义target是在一个左闭右闭的区间,即[left,right]代码实现: int left=0; int
2023-07-26 21:45:00
880
1
原创 学习笔记02-数据结构尾插法以及各类链表各类基本操作
创建链表有头插法和尾插法两种方法,今天要说的是尾插法,尾插法逻辑比较简单,直接上图只要将新节点新节点的数据域放上要存放的数据,然后将新节点的指针域置空让其当作尾节点,然后让指向尾节点的pTail的指针域指向新节点,然后赋值给指向尾节点的pTail即可。PNODE Create_list(){ PNODE pHead = (PNODE)malloc(sizeof(NODE));//创建带有头指针的链表 if (NULL == pHead)//判断内存分配是否成功 { print.
2021-05-05 11:58:51
343
原创 数据结构入门——头插法创建链表
数据结构入门——头插法创建链表 由于顺序表的存储特点是逻辑关系上相邻的两个元素在物理位置上也相邻,由于这个特点,在插入与删除元素的时候需要移动大量的元素,而链表在插入和删除元素时避免了这种情况。 要了解链表,首先应该知道指针,链表称之为线性结构,是因为链表每一个节点都存储着两部分元素,存放数据的为数据域,存放需要存放的数据,另一部分存放直接后继(下一个节点)的地址,...
2021-04-30 17:05:32
3002
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人