- 博客(29)
- 收藏
- 关注
原创 C++异常
1 异常概念异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch: 在您想要处理问题的地方,通过异常处理程序捕获异常.catch 关键字用于捕获异常,可以有多个catch进行捕获。try: try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 c
2021-10-25 22:13:27
111
原创 C++11特性(1)
1 列表初始化1.1 内置类型的列表初始化int main() { // 内置类型变量 int x1 = {10}; int x2{10}; int x3 = 1+2; int x4 = {1+2}; int x5{1+2}; // 数组 int arr1[5] {1,2,3,4,5}; int arr2[]{1,2,3,4,5}; // 动态数组,在C++98中不支持 int* arr3 = new int[5]{1,2,3,4,5}; // 标准容器 vecto
2021-10-25 21:48:55
147
原创 C++内存管理new和delete
1 C语言中动态内存管理方式1.1 malloc/realloc/calloc和free需要注意realloc动态内存可能会导致的二次释放问题void test(){ //malloc:申请一段空间 char* ptr = (char*)malloc(sizeof(char)); //调整空间大小 char* ptr2 = (char*)realloc(ptr, 2 * sizeof(char)); //申请新的空间,功能类似于malloc char* ptr3 = (char*)
2021-09-11 21:56:33
168
原创 图的两种遍历
深度优先搜索广度优先搜索1深度优先搜索//算法6.3 深度优先搜索遍历连通图的递归算法#include <iostream>using namespace std;#define MVNum 100 //最大顶点数typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 typedef struct{
2021-08-27 14:20:39
328
原创 图的存储结构
邻接矩阵领接表邻接矩阵//算法6.1 采用邻接矩阵表示法创建无向网#include <iostream>using namespace std;#define MaxInt 32767 //表示极大值,即∞#define MVNum 100 //最大顶点数#define OK 1 typedef char VerTexType; //假设顶点
2021-08-27 13:25:25
82
原创 哈夫曼树与哈夫曼编码
一、构造哈夫曼树二、哈夫曼编码构造哈夫曼树哈夫曼树的存储:typedef struct{ int weight;//结点的权值 int parent, lchild, rchild;//节点的双亲、左孩子、右孩子的下标}HTNode,*HuffmanTree;算法思想:1.初始化HT[1,2…2n-1]:lchild=rchild=parent=0;2.输入初始n个叶子结点:置HT[1, n]的weight值3.进行n-1次合并,依次产生n-1个结点HT[i],i=n+1…,
2021-08-24 22:57:47
103
原创 LRU缓存机制的实现
LRULRU缓存机制leetcode题class LRUCache { typedef list<pair<int,int>> LRUlist; typedef list<pair<int,int>>::iterator LRU_LIST_IT;public: LRUCache(int capacity){ _capacity=capacity; } int get(int key)
2021-08-21 23:25:01
91
原创 二叉树的建立
二叉树的建立例:通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树#include<stdio.h>#include<stdlib.h>typedef char DataType;typedef struct BNode{ struct BNode* _left; struct BNode* _right; DataType _data;}Node;Node* creatBinaryTree(DataType arr[], int* idx)
2021-08-20 20:32:18
66
原创 前序遍历、中序遍历、后序遍历非递归遍历的实现思想
1.前序遍历:遍历最左路径,节点入栈,访问遍历的每一个节点,获取栈顶元素,栈顶元素出栈。接着访问栈顶元素右子树。2.中序遍历:遍历最左路径,节点入栈但不访问。左路径访问完后,获取栈顶元素,栈顶元素出栈,访问栈顶元素。访问栈顶元素右子树。3.后序遍历:遍历最左路径,节点入栈不访问,或取栈顶元素,判断栈顶元素有没有右子树,若没有右子树或者右子树已经访问了,则访问栈顶元素,否则访问栈顶元素。来源青岛大学王卓...
2021-08-20 13:39:17
369
原创 二叉树的层次遍历
二叉树的层次遍历算法思想:1.将根节点入队2.队列不为空,一直循环,从队列取出一个节点*p,访问来源于青岛大学王卓void bTreeLevelOrder(Node* root){ //借助队列保存节点 Queue q; initQueue(&q); if (root) { queuePush(&q,root); } while (!isEmpty()) { Node* front = queuefront(&q); queuePop(&
2021-08-20 13:21:08
84
原创 用队列实现栈
用队列实现栈class MyStack {public: /** Initialize your data structure here. */ MyStack() { } /** Push element x onto stack. */ void push(int x) { q2.push(x); while(!q1.empty()) { q2.push(q1.front())
2021-08-19 10:40:09
57
原创 用栈实现队列
1.用栈实现队列class MyQueue {public: /** Initialize your data structure here. */ MyQueue() { } /** Push element x to the back of queue. */ void push(int x) { s1.push(x); } /** Removes the element from in front of
2021-08-19 10:38:42
61
原创 链表一些题(II)
1.链表回文结构/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};*/class PalindromeList {public: bool chkPalindrome(ListNode* A) { // write code here if(A==nullptr&&A->nex
2021-08-17 23:27:41
73
原创 数据结构的一些链表题目(I)
1.移除链表元素解:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* removeElements(struct ListNode* head, int val){ //思想:双指针struct ListNode*prev,*cur;prev=NULL;cur=he
2021-08-17 21:37:11
79
原创 单链表的增删查改
#include<stdio.h>#include<stdlib.h>typedef int SLTDateType;//定义节点:数据+指针 typedef struct ListNode{ SLTDateType* _data; struct ListNode* _next;}ListNode;typedef struct list{ //保存第一个节点地址 ListNode* _head;}list;//初始化链表void ListInit(lis
2021-08-15 17:53:26
52
原创 位段、枚举与联合
位段位段的内存分配枚举联合联合的特点联合大小的计算位段什么是位段位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int 。2.位段的成员名后边有一个冒号和一个数字。比如:struct A { int _a:2; int _b:5; int _c:10; int _d:30;};A就是一个位段类型。位段存储的原则:1.不能跨字节存储2.不能跨类型存储第一条typedef struct Test{
2021-08-11 17:25:26
62
原创 判断大小端的程序
设计判断大小端的程序第一种方式bool check_mode(){ int i = 1; return (*(char*)&i);}int main(){ int ret = check_mode(); if (ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0;}第二种方式//代码2int check_sys(){ union { int i; char c
2021-08-09 23:39:40
287
原创 float在内存中的存储
float底层存储根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:(1)(-1)^S * M * 2^E(2)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。(3)M表示有效数字,大于等于1,小于2。即1<=M<2注意:IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,
2021-08-09 23:32:51
196
原创 各种字符串函数的模拟实现
1.求字符串长度strlen2.长度不受限制的字符串函数strcpystrcatstrcmp3.长度受限制的字符串函数strncpystrncatstrncmp4.内存操作函数memmovememcpymemsetmemcmp字符串以’\0’结束。1.求字符串长度strlen第一种方法size_t my_strlen(const char* string){ //1.检查合法性 assert(string != NULL); //2.对指针进行参数保护 co
2021-08-09 22:57:44
76
原创 通过函数指针调用函数
函数指针int fun(int a, int b){ int ret = a + b; return ret;}void main(){ //第一种调用方法 //直接通过函数名调用 int result = fun(10, 20); int(*pfun)(int, int);//函数指针 //第二种调用方法 //标准写法,通过函数指针调用 pfun = &fun;//pfun用来保存函数的地址 result = (*pfun)(10, 20); //第三
2021-08-08 11:24:46
1058
原创 指针数组和数组指针笔试题
指针数组、数组指针、函数指针、指针函数用变量a给出下面的定义a) 一个整型数 int a;int a;b) 一个指向整型数的指针int* a;c) 一个指向指针的指针,它指向的指针是指向一个整型数int** a;d) 一个有10个整型数的数组int a[10];e) 一个有10个指针的数组,该指针是指向一个整型数的。int *a[10];f) 一个指向有10个整型数数组的指针]int (*a)[10];g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数i
2021-08-08 10:57:26
209
原创 sizeof()和strlen()笔试题全解析
void main(){ int a[3][4] = { 0 }; printf("%d\n", sizeof(a)); //48 printf("%d\n", sizeof(a[0][0]));//4 printf("%d\n", sizeof(a[0])); //16 printf("%d\n", sizeof(a[0] + 1)); //4 printf("%d\n", sizeof(*(a[0] + 1))); //4 printf("%d\n", sizeof(a
2021-08-08 10:51:45
114
原创 回调函数的定义
回调函数回调函数就是一个通过函数指针调用的函数。如果把函数的地址作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于对该事件或条件进行响应。本质:函数指针#include<stdio.h>int Find_Max(int arr[], int n){ int max_value = arr[0]; for (int i = 0; i < n; i++) {
2021-08-08 10:46:38
671
原创 makefile文件
一.make/makefile基本规则makefile文件中定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译, 甚至于进行更复杂的功能操作, 因为makefile就像一个Shell脚本一样, 其中也可以执行操作系统的命令. makefile带来的好处就是——“自动化编译”, 一旦写好, 只需要一个make命令, 整个工程完全自动编译, 极大的提高了软件开发的效率。make/makefile:项目的自动化构建工具Makefile:是一个文本文件,记录一个项目
2021-02-01 22:59:02
643
原创 类与对象初识
类与对象初识1.类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。struct Student{ void SetStudentInfo(const char* name, const char* gender, int age) { strcpy(_name, name); strcpy(_gender, gender); _age = age; } void PrintStudentInfo() { cout <<
2021-01-31 20:39:03
135
2
原创 基于范围的for循环
一、基于范围的for循环(C++11)1.范围for的语法2.范围for的使用条件二、指针空值nullptr一、基于范围的for循环(C++11)1.范围for的语法对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。#include<iostream>using namespace std;void
2021-01-31 18:20:29
5349
2
原创 auto关键字
auto关键字auto的使用auto的使用细则auto不能使用的场景1.auto的使用在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量 在C++11中,auto具有全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推到而得#include<iostream>using namespace std;int TestAuto(){ return 10;}int m
2021-01-31 17:07:12
84
原创 C语言进阶之自定义类型:结构体
结构体1.结构体的自引用struct Node{ int data; struct Node next;};这样在结构中包含一个类型为该结构本身的成员是否可以呢?不可以正确的自引用方式为:struct Node{ int datd; struct Node *next;};2.结构体内存对齐为什么存在内存对齐?大部分的参考资料都是如是说的:平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的
2020-11-30 20:10:40
229
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人