当前位置: 首页 > news >正文

Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)

数据结构的三要素包括:逻辑结构、存储结构、数据的运算。逻辑结构描述的是数据之间的逻辑关系,分为线性结构(线性表(数组、链表)、栈、队列)和非线性结构(图、树、集合)。物理结构也称为存储结构(顺序存储、链式存储、索引存储、散列存储)。

常见的数据结构分为线性数据结构和非线性数据结构,包括:数组、链表、栈、队列、树、图、散列表等。

 在Java中,数组这种数据结构有专门的实现:不可变数组(int [] array={})、可变数组(ArrayList),同样的链表这种数据结构也有专门的实现类(LinkedList),这些实现类都是java封装好的类,开箱即用。但是,java有没有专门针对于栈、队列这两种数据结构的封装类呢?

结果是肯定的。下面我们来介绍在java这门语言中,对栈、队列这两种数据结构的封装类。

一、栈(Stack、ArrayDeque、LinkedList)

首先来看一下JAVA集合体系图

 

Stack类,正如类名那样,该类是java对栈这种数据结构的封装,我们可以很容易滴使用该类中的方法实现栈的所有功能。下面是该类的五个方法

方法名返回类型说明
emptyboolean判断是否为空
peekE只返回栈顶端的元素,不弹出该元素(空栈会抛出异常)
popE弹出栈顶的元素
pushE将元素压入栈,并返回
searchint返回最靠近顶端的目标元素到顶端的距离(调用 lastIndexOf)

不过,由于Stack类是继承至Vector,Vector 类在方法上添加了 synchronized ,以达到线程安全的目的,不过 JVM 级别的 synchronized 特别消耗资源,已不被 Java 官方推荐使用。因此,用Stack类作为栈来使用已经不合时宜。

 ArrayDeque类实现了Deque接口,而Deque接口又继承至Queue接口,Queue是一个单向队列,在头部进行remove()、poll()出队操作,在尾部进行add()、offer()入队操作,使用peek()、element()方法检索队列头。下面的表格给出了Queue接口的方法,

boolean

add(E e) 

将指定的元素插入到此队列中,如果可以立即执行此操作,而不会违反容量限制, true在成功后返回 IllegalStateException如果当前没有可用空间,则抛出IllegalStateException。

E

element() 

检索,但不删除,这个队列的头。

boolean

offer(E e) 

如果在不违反容量限制的情况下立即执行,则将指定的元素插入到此队列中。

E

peek() 

检索但不删除此队列的头,如果此队列为空,则返回 null 。

E

poll() 

检索并删除此队列的头,如果此队列为空,则返回 null 。

E

remove() 

检索并删除此队列的头。

 Deque接口定义了双端队列,deque(double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构,它允许两端都可以进行入和出队操作的队列,即元素可以从队头出队和入队,也可以从队尾出队和入队。因此。Deque即可当成队列使用,也可当成栈使用。下面是Deque中定义的方法:

boolean

add(E e) 

将指定的元素插入此双端队列表示的队列中(换句话说,在此双端队列的尾部),如果它是立即可行且不会违反容量限制,返回 true在成功时和抛出 IllegalStateException如果当前没有空间可用的。

void

addFirst(E e) 

插入此双端队列的前面,如果它是立即可行且不会违反容量限制,抛出一个指定的元素 IllegalStateException如果当前没有空间可用。

void

addLast(E e) 

在插入如果它是立即可行且不会违反容量限制,抛出此双端队列的末尾指定元素 IllegalStateException如果当前没有空间可用。

boolean

contains(Object o) 

如果此deque包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索但不删除由此deque表示的队列的头部(换句话说,该deque的第一个元素)。

E

getFirst() 

检索,但不删除,这个deque的第一个元素。

E

getLast() 

检索,但不删除,这个deque的最后一个元素。

Iterator<E>

iterator() 

以正确的顺序返回此deque中的元素的迭代器。

boolean

offer(E e) 

将指定的元素插入由此deque表示的队列(换句话说,在该deque的尾部),如果可以立即执行,而不违反容量限制, true在成功时 false如果当前没有可用空间,则返回false。

boolean

offerFirst(E e) 

在此deque的前面插入指定的元素,除非它会违反容量限制。

boolean

offerLast(E e) 

在此deque的末尾插入指定的元素,除非它会违反容量限制。

E

peek() 

检索但不删除由此deque表示的队列的头部(换句话说,此deque的第一个元素),如果此deque为空,则返回 null 。

E

peekFirst() 

检索,但不删除,此deque的第一个元素,或返回 null如果这个deque是空的。

E

peekLast() 

检索但不删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

poll() 

检索并删除由此deque(换句话说,此deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。

E

pollFirst() 

检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

pollLast() 

检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

pop() 

从这个deque表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此deque表示的堆栈(换句话说,在此deque的头部),如果可以立即执行此操作而不违反容量限制,则抛出 IllegalStateException如果当前没有可用空间)。

E

remove() 

检索并删除由此deque表示的队列的头(换句话说,该deque的第一个元素)。

boolean

remove(Object o) 

从此deque中删除指定元素的第一个出现。

E

removeFirst() 

检索并删除此deque的第一个元素。

boolean

removeFirstOccurrence(Object o) 

从此deque中删除指定元素的第一个出现。

E

removeLast() 

检索并删除此deque的最后一个元素。

boolean

removeLastOccurrence(Object o) 

从此deque中删除指定元素的最后一次出现。

int

size() 

返回此deque中的元素数。

ArrayDeque类实现了Deque接口 ,类内方法基本与Deque一致。不过ArrayDeque类的底层是一个环形数组,具体来说在逻辑结构上是一个环形,但是实际存储结构上是一个一维数组。

在这里插入图片描述

下面是该类的常用方法 

boolean

add(E e) 

在此deque的末尾插入指定的元素。

void

addFirst(E e) 

在此deque前面插入指定的元素。

void

addLast(E e) 

在此deque的末尾插入指定的元素。

void

clear() 

从这个deque中删除所有的元素。

ArrayDeque<E>

clone() 

返回此deque的副本。

boolean

contains(Object o) 

如果此deque包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索,但不删除,由这个deque表示的队列的头。

E

getFirst() 

检索,但不删除,这个deque的第一个元素。

E

getLast() 

检索,但不删除,这个deque的最后一个元素。

boolean

isEmpty() 

如果此deque不包含元素,则返回 true 。

Iterator<E>

iterator() 

返回此deque中的元素的迭代器。

boolean

offer(E e) 

在此deque的末尾插入指定的元素。

boolean

offerFirst(E e) 

在此deque前面插入指定的元素。

boolean

offerLast(E e) 

在此deque的末尾插入指定的元素。

E

peek() 

检索但不删除由此deque表示的队列的头部,如果此deque为空,则返回 null 。

E

peekFirst() 

检索但不删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

peekLast() 

检索但不删除此deque的最后一个元素,或返回 null如果此deque为空)。

E

poll() 

检索并删除由此deque(换句话说,该deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。

E

pollFirst() 

检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

pollLast() 

检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

pop() 

从这个deque表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此deque表示的堆栈上。

E

remove() 

检索并删除由此deque表示的队列的头部。

boolean

remove(Object o) 

从此deque中删除指定元素的单个实例。

E

removeFirst() 

检索并删除此deque的第一个元素。

boolean

removeFirstOccurrence(Object o) 

删除此deque中指定元素的第一个出现(从头到尾遍历deque时)。

E

removeLast() 

检索并删除此deque的最后一个元素。

boolean

removeLastOccurrence(Object o) 

删除此deque中指定元素的最后一次(从头到尾遍历deque时)。

int

size() 

返回此deque中的元素数。

Spliterator<E>

spliterator() 

创建一个late-binding失败快速 Spliterator在这个deque的元素。

Object[]

toArray() 

以适当的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素)。

<T> T[]

toArray(T[] a) 

以正确的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

 LinkedList的底层维护了一个双向链表,它同时实现了List接口和Deque对口,因此它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),换句话说,它同时具备双向链表和双端队列特点。从继承图上来看,该类实现了Deque接口,因此可以使用接口中的方法。

boolean

add(E e) 

将指定的元素追加到此列表的末尾。

void

add(int index, E element) 

在此列表中的指定位置插入指定的元素。

boolean

addAll(Collection<? extends E> c) 

按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。

boolean

addAll(int index, Collection<? extends E> c) 

将指定集合中的所有元素插入到此列表中,从指定的位置开始。

void

addFirst(E e) 

在该列表开头插入指定的元素。

void

addLast(E e) 

将指定的元素追加到此列表的末尾。

void

clear() 

从列表中删除所有元素。

Object

clone() 

返回此 LinkedList的浅版本。

boolean

contains(Object o) 

如果此列表包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索但不删除此列表的头(第一个元素)。

E

get(int index) 

返回此列表中指定位置的元素。

E

getFirst() 

返回此列表中的第一个元素。

E

getLast() 

返回此列表中的最后一个元素。

int

indexOf(Object o) 

返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。

int

lastIndexOf(Object o) 

返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。

ListIterator<E>

listIterator(int index) 

从列表中的指定位置开始,返回此列表中元素的列表迭代器(按适当的顺序)。

boolean

offer(E e) 

将指定的元素添加为此列表的尾部(最后一个元素)。

boolean

offerFirst(E e) 

在此列表的前面插入指定的元素。

boolean

offerLast(E e) 

在该列表的末尾插入指定的元素。

E

peek() 

检索但不删除此列表的头(第一个元素)。

E

peekFirst() 

检索但不删除此列表的第一个元素,如果此列表为空,则返回 null 。

E

peekLast() 

检索但不删除此列表的最后一个元素,如果此列表为空,则返回 null 。

E

poll() 

检索并删除此列表的头(第一个元素)。

E

pollFirst() 

检索并删除此列表的第一个元素,如果此列表为空,则返回 null 。

E

pollLast() 

检索并删除此列表的最后一个元素,如果此列表为空,则返回 null 。

E

pop() 

从此列表表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此列表表示的堆栈上。

E

remove() 

检索并删除此列表的头(第一个元素)。

E

remove(int index) 

删除该列表中指定位置的元素。

boolean

remove(Object o) 

从列表中删除指定元素的第一个出现(如果存在)。

E

removeFirst() 

从此列表中删除并返回第一个元素。

boolean

removeFirstOccurrence(Object o) 

删除此列表中指定元素的第一个出现(从头到尾遍历列表时)。

E

removeLast() 

从此列表中删除并返回最后一个元素。

boolean

removeLastOccurrence(Object o) 

删除此列表中指定元素的最后一次出现(从头到尾遍历列表时)。

E

set(int index, E element) 

用指定的元素替换此列表中指定位置的元素。

int

size() 

返回此列表中的元素数。

Spliterator<E>

spliterator() 

在此列表中的元素上创建late-binding故障快速 Spliterator 。

Object[]

toArray() 

以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。

<T> T[]

toArray(T[] a) 

以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

由于LinkedList与ArrayDeque都是实现了Deque接口,因此这两个类中定义的方法几乎完全相同,因此这两个类的用法也几乎没有什么差异,虽然对于使用者而言,用这两个类都可以轻而易举的实现栈、队列的功能。

相关文章:

Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)

数据结构的三要素包括&#xff1a;逻辑结构、存储结构、数据的运算。逻辑结构描述的是数据之间的逻辑关系&#xff0c;分为线性结构&#xff08;线性表&#xff08;数组、链表&#xff09;、栈、队列&#xff09;和非线性结构&#xff08;图、树、集合&#xff09;。物理结构也…...

拯救了大批爬虫程序员,因为一个简单的神器

相信大家应该都写过爬虫&#xff0c;简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫&#xff0c;就需要在程序里面加上请求头和参数信息。类似这种&#xff1a;我们一般的步骤是&#xff0c;先到浏览器的网络请求中找到我们需要的请求&#xff0c;然后将请求头和参数信息…...

2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解

更新时间:2023-2-19 16:30 相关链接 &#xff08;1&#xff09;2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 &#xff08;2&#xff09;2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 &#xff08;3&#xff09;2023年美赛C题Wordle预测问题三、四建模…...

相关性-回忆录(持续更新)

1.TODO方向 &#xff08;1&#xff09;数据增强&#xff1a;finetuning阶段需要大量人工标注样本&#xff0c;消耗时间和成本。用户点击数据作为弱监督学习&#xff0c;可以尝试图网络构建节点和边&#xff08;query聚合&#xff09;&#xff1b; 使用展现未点击生成对抗网络进…...

(必备技能)使用Python实现屏幕截图

(必备技能)使用Python实现屏幕截图 文章目录 (必备技能)使用Python实现屏幕截图 一、序言二、环境配置 1、下载pyautogui包2、下载opencv-python包3、下载PyQt5包4、下载pypiwin32包 三、屏幕截屏源码与解析 1、使用pyautogui方法实现截屏2、使用PyQt方法实现截屏 a.获取窗口…...

「数据仓库」怎么选择现代数据仓库?

构建自己的数据仓库时要考虑的基本因素我们用过很多数据仓库。当我们的客户问我们&#xff0c;对于他们成长中的公司来说&#xff0c;最好的数据仓库是什么时&#xff0c;我们会根据他们的具体需求来考虑答案。通常&#xff0c;他们需要几乎实时的数据&#xff0c;价格低廉&…...

6.3 使用 Swagger 生成 Web API 文档

第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战&#xff1a;实现 Web API 版本控制 6.3 使用 Swagger 生成 Web API 文档 高质量的 API 文档在系统开发的过程中非常重要。本节介绍什么是 Swagger&#xff…...

Day894.加锁规则的一些问题 -MySQL实战

加锁规则的一些问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于加锁规则的一些问题的内容。 加锁规则&#xff0c;这个规则中&#xff0c;包含了两个“原则”、两个“优化”和一个“bug”&#xff1a; 原则 1&#xff1a;加锁的基本单位是 next-key lock。nex…...

【Flutter入门到进阶】Dart进阶篇---Dart异步编程

1 并行与并发的编程区别 1.1 并发与并行 1.1.1 说明 我们举个例子,如果有条高速公路 A 上面并排有 8 条车道,那么最大的并行车辆就是 8 辆此条高速公路 A 同时并排行走的车辆小于等于 8 辆的时候,车辆就可以并行运行。 CPU 也是这个原理,一个 CPU 相当于一个高速公路 A,核心数…...

点云配准方法原理(NDT、ICP)

配准是点云处理中的一个基础问题&#xff0c;众多学者此问题进行了广泛而深入的研究&#xff0c;也出现了一系列优秀成熟的算法&#xff0c;在三维建模、自动驾驶等领域发挥着重要的作用。 本文主要介绍粗配准NDT (Normal Distribution Transform) 与 精配准ICP (Iterative Cl…...

大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介

&#x1f4da;️Reference: IoT 边缘计算系列文章 什么是边缘容器&#xff1f; 边缘容器的概念 边缘容器是分散的计算资源&#xff0c;尽可能靠近最终用户或设备&#xff0c;以减少延迟、节省带宽并增强整体数字体验。 可以访问互联网的设备数量每天都在增加。有包括但不限于…...

代码随想录算法训练营第45天动态规划 背包基础 1 2、 416. 分割等和子集

文章目录01背包基础 &#xff08;二维数组&#xff09;思路递推公式初始化遍历顺序一维dp数组&#xff08;滚动数组&#xff09;一维数组的递推公式遍历顺序LeetCode 416. 分割等和子集思路总结01背包基础 &#xff08;二维数组&#xff09; 思路 根据动态规划五部进行分析&a…...

QT学习记录(六)类对象属性

类对象属性用来描述类对象的一些信息和当前的状态。类对象属性可以由类的编写者在编写类的时候定义&#xff0c;也可以由类的使用者在使用对象的时候定义。 由类的编写者定义 QPROPERTY()宏就是用来定义一个对象属性。 以第二行属性举例 QPROPERTY(bool enabled READ isEnabl…...

Spring Cloud Alibaba从搭建到源码完整进阶教程

微服务简介 Spring Cloud Alibaba 微服务简介 Nacos注册中心配置中心 Spring Cloud Nacos实战&#xff08;一&#xff09;- 下载和安装 Spring Cloud Nacos实战&#xff08;二&#xff09;- 服务提供者注册 Spring Cloud Nacos实战&#xff08;三&#xff09;- 服务消费者…...

Spring Cloud Nacos实战(一)- 下载和安装

Spring Cloud Alibaba Nacos下载和安装 Nacos介绍 ​ Nacos&#xff08;Naming Configuration Service&#xff09; 是一个易于使用的动态服务发现、配置和服务管理平台&#xff0c;用于构建云原生应用程序 ​ 服务发现是微服务架构中的关键组件之一。Nacos 致力于帮助您发现…...

深入理解设备像素比

文章目录参考描述像素分辨率显示分辨率图像分辨率物理分辨率分辨率单位&#xff08;仅部分&#xff09;DPIPPI设备像素比设备物理像素设备独立像素设备像素比产生放大与缩小尾声参考 项目描述关于物理像素、逻辑像素&#xff08;css像素&#xff09;、分辨率、像素比的超详细讲…...

Revisiting Distributed Synchronous SGD 带有Back-up机制的分布式同步SGD方法 论文精读

论文链接&#xff1a;Revisiting Distributed Synchronous SGD ABS 本文介绍了用于分布式机器学习的同步和异步SGDSGDSGD&#xff0c;同时指出各自的缺点&#xff1a;stragglersstragglersstragglers和stalenessstalenessstaleness。 同时为了解决同步SGDSGDSGD存在straggle…...

shiro CVE-2020-13933

0x00 前言 同CVE-2020-1957&#xff0c;补充一下笔记&#xff0c;在CVE-2020-1957的基础上进行了绕过。 影响版本&#xff1a;Apache Shiro < 1.6.0 环境搭建参考&#xff1a;shiro CVE-2020-1957 0x01 漏洞复现 CVE-2020-13933中使用%3b绕过了shiro /*的检测方式&…...

斐波那契数列(递归+迭代)

目录什么是斐波那契数列递归写法使用递归写法的缺点迭代写法(效率高)什么是斐波那契数列 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例…...

2022黑马Redis跟学笔记.实战篇(六)

2022黑马Redis跟学笔记.实战篇 六4.7.达人探店功能4.7.1.分享探店图文1. 达人探店-发布探店笔记2. 达人探店-查看探店笔记4.7.2.点赞功能4.7.3.基于List实现点赞用户列表TOP104.7.4.基于SortedSet实现点赞排行榜4.8.关注列表4.8.1.关注列表实现原理4.8.2.添加关注1. 好友关注-关…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...

[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...