![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
qx LIU 2000
这个作者很懒,什么都没留下…
展开
-
C++--双端队列deque
双端队列这个结构 ,总是作为stack和queue容器适配器的默认模板参数类型,它的功能很丰富,头删头插,尾插尾删,随机存取等等,看起来就是vector和list的合体。为什么这么说呢?优点缺点vector1.随机访问 2.尾插头、中部插入删除list任意位置插入删除随机访问那么在功能上,我们可以清楚的看到 deque = vector+list真的是这样么?结论:1.deque不能替代vector和list2.deque采用operator [ ]原创 2021-09-16 16:35:18 · 503 阅读 · 0 评论 -
C++ --优先级队列模拟实现
优先级队列:priority_queue template <class T,class Container=vector<T>,class Compare = less<T>> class priority_queue { public: private: Container _con; Compare com; };}我们先来介绍一下priority_queue的类模板的第三个模板参数class Compare = less<T原创 2021-09-16 15:52:03 · 197 阅读 · 0 评论 -
C++初阶--string模拟实现
string实现第一部分:默认成员函数的基本接口以及深浅拷贝相关问题。第二部分:string增删查改等功能模拟实现第一部分:默认成员函数的基本接口以及深浅拷贝相关问题。#pragma once#include <iostream>using namespace std;namespace lqx{ class string { public: 构造函数 string(const char* str = "") :_str(new char[strlen(str原创 2021-07-23 20:45:18 · 227 阅读 · 0 评论 -
C++初阶--vector模拟实现
今天我们不直接上代码了,我们先来分析一下vector这个容器。我们来看看这个东西vector<vector>这我们可以大概猜到是一个二维数组。但并不完全是,二维数组是一个n*n 的矩形结构,而这里的vector套vector可不是这样,我们来剖析一下它当我们执行vv [ i] [ j ] 这行代码时首先执行 vv. operator [ i ],也就是vv [ i ] 这时候我们在一个大vector中找到了,很多很多的vector。每一个vector 是用i 控制的,一原创 2021-07-29 20:27:11 · 313 阅读 · 0 评论 -
C++初阶--list的模拟实现
今天来模拟实现list我们先来看看官方文档中对于list的描述我们先大致了解一下list的遍历迭代器对于迭代器我们可以用while循环+begin()end()。同时还可以用迭代器区间。当然迭代器区间的方式只适用于内存连续的结构比如数组stringvector等它们的原生指针就可以当作迭代器来用。范围for其实范围for和迭代器的底层是完全一样的,我们只有写好迭代器,才能用范围for,而且这里的迭代器必须和库里的命名一样才可以用范围for我们再来了解一下有关算法函数中,我原创 2021-08-03 02:34:12 · 564 阅读 · 1 评论 -
数据结构-排序-计数排序
计数排序–非比较排序首先我们要明白两个概念:绝对映射相对映射我们创建要给count数组,统计出Arr数组每个数出现的次数A[ i ] 的值为多少,就给count对应位置进行操作:count[ A [ i ]]++此时两数组的对应关系叫做 绝对映射。再来看一种情况如果绝对映射的方法创建数组,那么 0-9 个空间就浪费了,所以我们采用相对映射。0代表10,1代表11,2代表12,即为 min+i 则可还原为原数据。完整的代码void CountSort(int* a, int n原创 2021-05-14 02:03:50 · 158 阅读 · 0 评论 -
数据结构-排序-归并排序
归并排序递归算法void _MergeSort(int * a, int left, int right, int * tmp){ if (left >= right) return; int mid = (left + right) >> 1; _MergeSort(a, left, mid, tmp); _MergeSort(a, mid + 1, right, tmp); int begin1 = left, end1 = mid; int begin2 =原创 2021-05-13 17:29:48 · 95 阅读 · 0 评论 -
数据结构-排序-快排
快排算法思想单趟排序:选出一个KEY,一般是最左边的或者是最右边的,把KEY放到他正确的位置上去,左边的比KEY小,右边的比KEY大。左边的值做KEY,则右边的先走。三数取中//三数取中,可以优化有序数列的情况。但当其元素都相等的时候,就无法进行优化。int GetMidIndex(int *a, int left, int right){ int mid = (left + right) >> 1; if (a[left] < a[mid]) { if (a[mi原创 2021-05-11 15:49:45 · 115 阅读 · 0 评论 -
数据结构-排序-冒泡排序
冒泡排序复杂度最坏:O(N^2)最好:O(N)void BubbleSort(int * a, int n){ ////one //for (int i = 0; i < n; i++) //{ // for (int j = 1; j < n - i; j++) // { // if (a[j - 1]>a[j]) // Swap(&a[j - 1], &a[j]); // } //} //two for (int end = n;原创 2021-05-11 15:04:40 · 82 阅读 · 0 评论 -
数据结构-排序-堆排序
堆排序void AdjustDwon(int * a, int n, int root){ int child = root * 2 + 1; while (child < n) { if (child + 1 < n && a[child + 1] > a[child]) { ++child; } if (a[child] > a[root]) { Swap(&a[child], &a[root]);原创 2021-05-10 16:10:24 · 84 阅读 · 0 评论 -
数据结构-排序-选择排序
选择排序void Swap(int* p1,int * p2){ int tmp = *p1; *p1 = *p2; *p2 = tmp;}void SelectSort(int * a, int n){ int left = 0, right = n - 1; while (left < right) { int minIndex = left, maxIndex = right; for (int i = left; i < right; i++) {原创 2021-05-10 15:59:30 · 74 阅读 · 0 评论 -
数据结构-排序-希尔排序
希尔排序1、预排序 ----> 接近有序2、直接插入排序从而在时间复杂度上有很大的提升gap越大,大小数可以更快挪到对应的位置,越不接近有序gap越小,大的和小的数可以更慢的挪到对应的位置,越接近有序gap == 1 为直接插入排序void ShellSort(int* a, int n){ int gap = n; while (gap > 1) { gap = (gap / 3 + 1); for (int i = 0; i < n - ga原创 2021-05-10 15:35:36 · 123 阅读 · 0 评论 -
数据结构-排序-插入排序
插入排序一、思想:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经拍好的有序序列中,直到所有记录插入完为止,得到一个新的有序序列-------------扑克牌。解释:当插入第 i (i>=1)个元素时,面前的array[0],array[1],…array[i-1] 已经排好序,此时用array[i]的排序码与前面的排序码进行顺序比较,找到插入位置将array[i]插入,原来位置上的元素后移复杂问题拆解:1、先写单趟排序2、再写多趟排原创 2021-05-10 15:14:13 · 130 阅读 · 0 评论 -
【数据结构】-二叉树中序遍历递归【学习笔记】
二叉树中序遍历递归的实现原创 2021-04-27 18:22:36 · 124 阅读 · 0 评论 -
【数据结构】-初阶-堆
Heap.htypedef int HPDataType;typedef struct Heap{ HPDataType* _a; int _size; int _capacity;}Heap;void HeapCreate(Heap* hp, HPDataType* a, int n);void HeapDestory(Heap* hp);void HeapPush(Heap* hp, HPDataType x);void HeapPop(Heap* hp);void Ad原创 2021-04-26 18:18:15 · 124 阅读 · 0 评论 -
[数据结构] -堆与二叉树 【学习笔记】
二叉树1、满二叉树:k层满二叉树节点总数位(2^k)-12、完全二叉树:可以不满,但必须按顺序告诉你一棵二叉树有N个节点,那么他的高度是多少?2^k - 1 =Nk = log(N+1)若根节点为第一层,那么非空二叉树的第i层上最多有2^(i-1)个节点若根节点为第一层,那么深度为h的二叉树的最大结点数是 2^h -1度为零的节点个数比度为二的节点个数多一个:n0 = n2 +1;来两道题练练手,看看概念理解的怎么样?1、某二叉树共有 399 个结点,其中 有199个为 度为2的原创 2021-04-26 16:39:03 · 897 阅读 · 0 评论 -
leetcode 225. 用队列实现栈【数据结构初阶】
typedef int QDatatype;typedef struct QueueNode{ QDatatype data; struct QueueNode * next;}QueueNode;typedef struct Queue{ QueueNode* head; QueueNode* tail;}Queue;void QueueInit(Queue * pq);void QueueDestory(Queue* pq);void QueuePush(Queue*原创 2021-04-22 16:28:37 · 140 阅读 · 0 评论 -
leetcode 232.用栈实现队列
typedef struct { int* stk; int stkSize; int stkCapacity;} Stack;Stack* stackCreate(int cpacity) { Stack* ret = malloc(sizeof(Stack)); ret->stk = malloc(sizeof(int) * cpacity); ret->stkSize = 0; ret->stkCapacity = cpa原创 2021-04-22 16:26:00 · 68 阅读 · 0 评论 -
leetcode 622 .设计循环队列
typedef struct { int *a; int k ; int front; int tail;} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); obj->a = (int *)malloc(sizeof(i原创 2021-04-22 16:24:33 · 86 阅读 · 0 评论 -
【数据结构】-初阶-栈
C语言stack.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#define Capacity 2typedef int StackDataType;typedef struct Stack{ StackDataType *array; size_t size; size_t capacity;}Stack;void StackIni.原创 2021-04-21 15:31:58 · 87 阅读 · 0 评论 -
【数据结构】-初阶-队列
queue.h#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef int QDatatype;typedef struct QueueNode{ QDatatype data; struct QueueNode * next;}QueueNode;typedef struct Queue{ QueueNode* head; QueueNode* tail;}.原创 2021-04-21 15:30:30 · 89 阅读 · 0 评论 -
【数据结构】-初阶-双向带头循环链表
List.c#define _CRT_SECURE_NO_WARNINGS 1#include "List.h"ListNode* BuyListNode(LTDateType x){ ListNode* newnode = (ListNode*)malloc(sizeof(ListNode)); newnode->next = NULL; newnode->prev = NULL; newnode->data = x; return newnode;}List原创 2021-04-20 20:24:32 · 125 阅读 · 0 评论 -
leetcode 138.复制带随机指针的链表
拷贝节点链接在原节点后面/** * Definition for a Node. * struct Node { * int val; * struct Node *next; * struct Node *random; * }; */struct Node* copyRandomList(struct Node* head) { struct Node* cur = head; while(cur) { struc...原创 2021-04-13 15:20:24 · 92 阅读 · 0 评论 -
leetcode 141.环形链表(一和二)
代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */bool hasCycle(struct ListNode *head) { struct ListNode* slow = head,*fast = head; while(fast && fast -> next) ...原创 2021-04-13 14:37:48 · 83 阅读 · 0 评论 -
通讯录(动态存储)
test.c#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"enum Option{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT, EMPTY, DESTORY};void menu(){ printf("**********************************\n"); printf("***** 1.add 2.del ******原创 2021-03-10 13:06:18 · 93 阅读 · 0 评论 -
自定义类型:结构体,枚举,联合
C语言进阶之自定义类型结构体,枚举,联合文章目录C语言进阶之自定义类型结构体,枚举,联合结构体枚举联合(共用体)结构体结构的声明struct tag{ member-list;}variable-list;特殊的声明struct{ int a; char b; float c;}x;此处省略掉了标签 tag结构体的自引用//方法一struct Node{ int data; struct Node* next;};//方法二typedef str原创 2021-03-07 16:43:56 · 120 阅读 · 0 评论 -
数据在内存中的存储
深度剖析数据在内存中的存储一、整形在内存中的存储原码(输入或输出时的数的二进制表示)反码补码 (内存中的存储方式)1.有符号数存储结构均有符号位(首位)+数值位(非首位)(正数符号位为‘0’,负数符号位为‘1’).2.正数:三码相同.3.负数:原码符号位不变,其余按位取反 -->反码,反码+1–>补码.大端和小端大端-- 数据的低字节位存储在内存的高地址处小端-- 数据的低字节位存储在内存的低地址处每种编译器可能存储方式不同,其中vs2013采用的是小端存储的原创 2021-02-01 00:12:49 · 157 阅读 · 0 评论 -
扫雷
扫雷扫雷的基本实现-----C语言game.h#include <stdio.h>#include <stdlib.h>#include <time.h>`#define EAZY_COUNT 10#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2//初始化棋盘void Initboard(char[ROWS][COLS], int rows, int cols,原创 2021-01-25 17:30:23 · 90 阅读 · 0 评论 -
三子棋
三子棋的实现C语言—三子棋test.c//test.c#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){ printf("***********************************************\n"); printf("**************** 1.PLAY *****************\n"); printf("**************** 2.E原创 2021-01-24 19:02:26 · 78 阅读 · 0 评论 -
汉诺塔
汉诺塔问题递归的C语言实现//hanoi ----void move(char x, char y){ printf("%c-->%c", x, y);}void hanoi(int n, char a, char b, char c){ if (n == 1) move(a, c); else { hanoi(n - 1, a, c, b); printf("\n"); move(a, c); printf("\n"); hanoi(n - 1, b,原创 2021-01-24 00:47:34 · 84 阅读 · 0 评论 -
c语言中的二分查找
二分查找注意:只能用于 有序 数列查找举一个简单的例子:查找1-10中的数字7元素#include <stdio.h>int main(){ int k = 7; int arr[]={1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; int sz = sizeof(arr) / sizeof(arr[0]);//求数组的长度。 int left = 0;//左下标 int right = sz - 1;//右下标:数组长度减一 wh原创 2021-01-17 00:55:51 · 156 阅读 · 0 评论