目录
数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。每一种数据结构都有着独特的数据存储方式。常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:
顺序表的接口:
struct SerList//动态顺序表
{
SQDateType *a;
int size;
int capacity;
};
typedef struct SerList SL;
void SeqListPushBack(SL* ps, SQDateType x);
void SeqListPushFront(SL* ps, SQDateType x);
void SeqListPopBack(SL* ps);
void SeqListPopFront(SL* ps);
void SeqListInsert(SL* ps, int pos, SQDateType x);
void SeqListErase(SL* ps, int pos);
int SeqListFind(SL* ps, SQDateType x);
void SeqListModify(SL* ps, int pos, SQDateType x);
顺序表的问题:
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
单链表的接口:
typedef int SLDateType;
typedef struct SListNode
{
SLDateType data;
struct SListNode* next;//注意:这里不能嵌套结构体,只能是地址
}SLTNode;
void SListPrint(SLTNode* phead);
void SListPushBack(SLTNode** pphead, SLDateType x);
void SListPushFront(SLTNode** pphead, SLDateType x);
void SListPopBack(SLTNode** pphead);
void SListPopFront(SLTNode** pphead);
SLTNode* SListFind(SLTNode* phead, SLDateType x);
void SListInsert(SLTNode** pphead, SLTNode* pos, SLDateType x);
void SListErase(SLTNode** pphead, SLTNode* pos);
int SListLen(SLTNode* phead);//求链表的长度
双向循环链表的接口:
typedef int LTDataType;
typedef struct ListNode
{
LTDataType data;
struct ListNode* prev;
struct ListNode* next;
}ListNode;
void ListInit(ListNode** pphead);
void ListDestroy(ListNode* phead);
void ListPushBack(ListNode* phead, LTDataType x);
void ListPushFront(ListNode* phead, LTDataType x);
void ListPopBack(ListNode* phead);
void ListPopFront(ListNode* phead);
void ListPrint(ListNode* phead);
ListNode* ListFind(ListNode* phead, LTDataType x);
void ListInsert(ListNode* phead, ListNode* pos, LTDataType x);
void ListErase(ListNode* phead, ListNode* pos);
顺序表:
链表:
栈的接口(用数组来实现的,也可以用链表):
//栈可以用顺序表(数组)来实现
typedef int STDateType;
typedef struct Stack
{
STDateType* a;
int top;//top用来操作栈顶的数据,top相当于size
int capacity;
}Stack;
void StackInit(Stack* pst);
void StackDestroy(Stack* pst);
void StackPush(Stack* pst, STDateType x);
void StackPop(Stack* pst);
STDateType StackTop(Stack* pst);
bool StackEmpty(Stack* pst);
int StackSize(Stack* pst);
队列的接口:
typedef int QDataType;
// 链式结构:表示队列
typedef struct QListNode
{
struct QListNode* next;
QDataType data;
}QNode;
// 队列可以用链表来实现
typedef struct Queue
{
QNode* head;
QNode* tail;
}Queue;
void QueueInit(Queue* q);// 初始化队列
void QueueDestroy(Queue* q);// 销毁队列
void QueuePush(Queue* q, QDataType data);// 队尾入队列
void QueuePop(Queue* q);// 队头出队列
QDataType QueueFront(Queue* q);// 获取队列头部元素
QDataType QueueBack(Queue* q);// 获取队列队尾元素
int QueueSize(Queue* q);// 获取队列中有效元素个数
bool QueueEmpty(Queue* q);// 检测队列是否为空
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
在日常的应用中,我们讨论和用的更多的是树的其中一种结构,就是二叉树。
二叉树是树的特殊一种,具有如下特点:
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在 物理上是一个数组,在逻辑上是一颗二叉树。
链式结构接口如下:(包括三种遍历方式:前序遍历、中序遍历、后序遍历,以及层序遍历)
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi);
// 二叉树销毁
void BinaryTreeDestory(BTNode** root);
// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root);
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root);
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root);
// 层序遍历
void BinaryTreeLevelOrder(BTNode* root);
// 判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root);
堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),满足前者的表达式的成为小顶堆,满足后者表达式的为大顶堆,这两者的结构图可以用完全二叉树排列出来,示例图如下:
堆的接口实现:(向下调整算法、向上调整算法)
typedef int HPDataType;
//用数组来实现堆(堆就是完全二叉树)
typedef struct Heap
{
HPDataType* _a;
int _size;
int _capacity;
}Heap;
void AdjustDown(int* a, int n, int parent);
void AdjustUp(int* a, int child);
// 堆的构建
void HeapCreate(Heap* hp, HPDataType* a, int n);
// 堆的销毁
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的删除
void HeapPop(Heap* hp);
// 取堆顶的数据
HPDataType HeapTop(Heap* hp);
// 堆的数据个数
int HeapSize(Heap* hp);
// 堆的判空
int HeapEmpty(Heap* hp);
// 对数组进行堆排序
void HeapSort(int* a, int n);
(待更新……)
首先我们要知道 模拟事件全部是通过input命令来实现的例如我们输入如下命令即可模拟一次BACK键的按下和弹起:adb shell sendevent /dev/input/event0 1 158 1adb shell sendevent /dev/input/event0 1 158 0说一下模拟用户滑动屏幕 input swipe <x1> <y1> &...
spring 项目启动报错org.springframework.beans.factory.annotation.InjectionMetadata5 请帮忙看下这个是什么问题。严重: Servlet /yage threw load() exception java.lang.NoSuchMethodError: org.springframework.beans.factory.annot
方法:<el-table :data="tableData" style="width: 100%" @row-click="clickData" // 当某一行被点击时会触发该事件 > </el-table>-----------------------------------------------methods: { clickData(row, event, column) { consol
Pytorch实现MNIST手写数据集识别pytorch从入门到实战学习笔记本文搭建简单的深层神经网络模型,对MNIST手写数据集进行识别。该神经网络由784个输入神经元,100个隐层神经元和10个输出神经元构成。待读者通过这个例子掌握深层神经网络特征,便可自行设计。import torchimport torch.nn as nnfrom torch.autograd import ...
Linux命令 ls -l s输出内容含义详解1. ls 只显示文件名或者文件目录2.ls -l(这个参数是字母L的小写,不是数字1) 用来查看详细的文件资料 在某个目录下键入ls -l可能会显示如下信息: 文件属性(占10个字符空间) 文件数 拥有者 所属的group 文件大小 建档日期 ...
用JavaScript实现一个简易的todolist.
引言先来一张ROS的美照:参考官方wiki安装:http://wiki.ros.org/melodic/Installation/Ubuntu在Ubuntu的【软件和更新】配置如下:添加软件源sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/...
三维点云的语义分割是许多现实应用中的一个具有挑战性的问题。尽管深度学习已经彻底改变了图像语义分割领域,但迄今为止,它对点云数据的影响有限。最近基于3D深度学习方法(3D-CNNs)的尝试取得了低于预期的结果。这种方法需要对底层点云数据进行体素化,因此降低了空间分辨率并增加了内存消耗。此外,3D CNN在很大程度上受到注释数据集可用性的限制。在本文中,我们提出了一种替代框架,以避免3D-CNNs的限制。我们首先将点云投影到一组合成2D图像上,而不是直接在3D中解决问题。
一、表结构-- Create tablecreate table CARD_BIN_CTRL( CARD_BIN CHAR(12) not null, CARD_LEN INTEGER not null, CHANNEL_TYPE CHAR(2) not null, CARD_BIN_LEN INTEGER, CARD_TYPE CH
垃圾回收对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。当我们不再需要某个东西时会发生什么?JavaScript 引...
问题描述试题编号: 201403-1试题名称: 相反数时间限制: 1.0s内存限制: 256.0MB问题描述: 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。输入格式 第一行包含一个正整数 N。(1 ≤ N ≤ 500)。 第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。...
文章大部分引自:(https://blog.csdn.net/qq_29350001/article/details/50904312)一、PCB差分布线参考: Altium Designer -- 精心总结二、差分信号:2.1 定义差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅...