JS实现数据结构与算法

news2025/3/10 11:08:44

队列

1、普通队列

利用数组push和shif 就可以简单实现

 2、利用链表的方式实现队列 

class MyQueue {
	constructor(){
		this.head = null
		this.tail = null
		this.length = 0
	}

	add(value){
		let node = {value}
		if(this.length === 0){
			this.head = node
			this.tail = node
		}else{
			this.tail.next = node
			this.tail = node
		}
		this.length++
	}

	delete(){
		if(this.length <= 0) {return null}
		let value = null

		if(this.length === 1){
			value = this.head.value
			this.head = null
		}else{
			value = this.head.value
			this.head = this.head.next
		}
		return value
		this.length--
	}
}

// 功能测试
const queue = new MyQueue()
queue.add(100)
console.log('length1', queue.length) // 1
queue.add(200)
console.log('length2', queue.length) // 2
console.log('delete1', queue.delete()) // 100
queue.add(300)
console.log('length3', queue.length) // 2
console.log('delete2', queue.delete()) // 200
console.log('length4', queue.length) // 1
console.log('delete3', queue.delete()) // 300
console.log('length5', queue.length) // 0

 

 栈 

1、普通栈

2、用Js链表实现入栈和出栈 

class MyNode{
	//这个类似于一个替换值t
	constructor(val){
		this.value = val
		this.next = null
	}
}
class MyStack{
	constructor(){
		this.stack = null
	}
	add(val){
		const node = new MyNode(val)
		//首先将入栈的值给t.value里:{value:100,next:null}
		node.next = this.stack
		//其次将上一个入栈的值赋值给t.next
		//形成新入的值在最外层,{value:200,next:{value:100,next:null}}
		this.stack = node
		//最后将t的整体包裹了新入栈的数据的对象赋值给当前的内容
		console.log('this.next',this.stack);
	}
	delete(){
		const t = this.stack
		//当前栈已空,直接返回,t是 MyStack.stack
		if(t === null){
			return '当前栈已空'
		}else{
			//将内层的next的赋值给原本的值,实现出栈
			this.stack = t.next
			return t.value
		}
	}
}
const stack = new MyStack()
stack.add(100)
stack.add(200)
console.log('delete',stack.delete());
console.log('delete',stack.delete());
console.log('delete',stack.delete());

3、用栈来翻转字符串,只能用push和pop两个API 

function onStack(val){
	let arr1 = []
	//入栈
	for(let i of val){
		arr1.push(i)
	}

	let arr2 = ''
	let popValue = null
	//出栈
	while(arr1.length){
		popValue = arr1.pop()
		arr2 += popValue
	}

	return arr2
}
console.log(onStack('12345'));

排序 

1、冒泡排序

2、选择排序 

3、快速排序

注意:快速排序的规则就是先找中间的数,比中间大的放在左边,小的放在右边,再去对两边的数进行同样的操作。

注意:循环一次是O(n),双层循环是O(n^2),二分查找O(logn),快速排序是O(n*logn)

function quickSort(arr) {
			if(arr.length <= 0){
				return arr
			}
			let midIndex = Math.floor(arr.length/2) 
			let midValue = arr[midIndex]

			let left = []
			let right = []

			for(let i = 0; i < arr.length; i++){
				if(i !== midIndex){
					if(midValue > arr[i]){
						left.push(arr[i])
					}else{
						right.push(arr[i])
					}
				}
			}

			return [...quickSort(left),midValue,...quickSort(right)]
		}

		let arr = [12, 45, 78, 25, 12, 3, 45, 74, 1, 14, 85]
		console.log(quickSort(arr));

 

查找

1、二分查找

注意:二分查找首先是查找的内容是已排序

           时间复杂度是O(logn)

          需要找的数先去找数组中中间的值,去作对比,大于就往右边找,小于就往左边找。下一次继续这个操作。

          方法:递归或循环

          求中间元素的值mid,即:mid = left + (right - left) / 2 得到中间下标

function find(arr, x) {
	let left = 0
	let right = arr.length - 1
	let mid = 0

	while (left <= right) {
		mid = Math.floor(left + (right - left) / 2)
		if (arr[mid] === x) {
			return {
				type: true,
				position: mid
			}
		} else if (arr[mid] < x) {
			left = mid + 1
		} else {
			right = mid - 1
		}
	}

	return {
		type: false,
		position: null
	}
}

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let x = 3
console.log(find(arr, x));

 

1、树的优先遍历

 

 一、树的深度优先结果:ABCGDEFHL 

 

 

 注意:

  • 访问根节点;
  • 对根节点的children持续进行深度优先遍历(递归);
function dfs(root) {
	console.log(root.value)
	if(root.children){
		root.children.forEach(dfs)
	}
}
dfs(tree) // 这个tree就是前面定义的那个树

 

 二、广度优先遍历结果:ABECGDFHL

注意:广度优先遍历是,先遍历根节点,再同层从左到右遍历

 

注意:

  • 创建要给队列,把根节点入队;
  • 把队头出队并访问;
  • 把队头的children依次入队;
  • 重复执行2、3步,直到队列为空。
function deep(tree){
	let queue = []
	queue.push(tree)

	while(queue.length > 0){
		const node = queue.shift()
		console.log(node.value);
		if(node.children){
			node.children.forEach(val => {
				queue.push(val)
			})
		}
	}
	
}

 

2、二叉树

 一、用JS对象表达树

let tree = {
	value:'A',
	left:{
		value:'B',
		left:{
			value:'C',
			left:null,
			right:{
				value:'G',
				left:null,
				right:null
			}
		},
		right:{
			value:'D',
			left:null,
			right:null
		}
	},
	right:{
		value:'E',
		left:{
			value:'F',
			left:{
				value:'H',
				left:null,
				right:null
			},
			right:{
				value:'L',
				left:null,
				right:null
			}
		},
		right:null
	}
}

3、二叉树的前、中、后序遍历

 

 1、前序遍历:中、左、右 

 

2、中序遍历:左、中、右  

 

 3、后序遍历:左、中、右

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1198529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hosts文件地址

Hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开&#xff0c;其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”&#xff0c;当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从Hosts文件中寻找对应的IP地址&…

Typescript -尚硅谷

基础 1.ts是以js为基础构建的语言&#xff0c;是一个js的超集(对js进行了扩展)&#xff1b; 2.ts(type)最主要的功能是在js的基础上引入了类型的概念; Js的类型是只针对于值而言&#xff0c;ts的类型是针对于变量而言 Ts可以被编译成任意版本的js&#xff0c;从而进一步解决了…

企业邮箱本地私有化部署解决方案

随着互联网化进程不断深入&#xff0c;加快推进企业信息化系统建设&#xff0c;已经成为提高企业核心竞争力的重要途径。企业对企业邮箱系统的需求越来越大&#xff0c;企业邮箱系统作为企业级通讯工具中的利器&#xff0c;在协同办公和内外业务交流上发挥着无可替代的巨大作用…

LLM代码生成器的挑战【GDELT早期观察】

越来越多的研究开始对LLM大模型生成的代码的质量提出质疑&#xff0c;尽管科技行业不断推出越来越多的旨在增强甚至取代人类编码员的工具。 随着我们&#xff08;GDELT&#xff09;继续探索和评估越来越多的此类工具&#xff0c;以下是我们的一些早期观察结果。 在线工具推荐&a…

将复数中的虚部取反 即对复数求共轭 numpy.conjugate()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将复数中的虚部取反 即对复数求共轭 numpy.conjugate() [太阳]选择题 请问以下代码中执行语句输出结果是&#xff1f; import numpy as np a np.array([1 2j, 3 - 4j]) print("【显示…

Linux学习教程(第二章 Linux系统安装)1

第二章 Linux系统安装 学习 Linux&#xff0c;首先要学会搭建 Linux 系统环境&#xff0c;也就是学会在你的电脑上安装 Linux 系统。 很多初学者对 Linux 望而生畏&#xff0c;多数是因为对 Linux 系统安装的恐惧&#xff0c;害怕破坏电脑本身的系统&#xff0c;害怕硬盘数据…

第二十五节——Vuex--历史遗留

文档地址 Vuex 是什么&#xff1f; | Vuex version V4.x 一、概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。一个状态自管理应用包含以下几个部…

大数据Doris(二十一):数据导入演示

文章目录 数据导入演示 一、启动zookeeper集群(三台节点都启动) 二、启动hdfs集群

计算机网络——物理层-传输方式(串行传输、并行传输,同步传输、异步传输,单工、半双工和全双工通信)

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工和全双工通信 串行传输和并行传输 串行传输是指数据是一个比特一个比特依次发送的。因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可。 并行传输是指一次发送n个比特&#xff0c;而不是一个比特&…

图论13-最小生成树-Kruskal算法+Prim算法

文章目录 1 最小生成树2 最小生成树Kruskal算法的实现2.1 算法思想2.2 算法实现2.2.1 如果图不联通&#xff0c;直接返回空&#xff0c;该图没有mst2.2.2 获得图中的所有边&#xff0c;并且进行排序2.2.2.1 Edge类要实现Comparable接口&#xff0c;并重写compareTo方法 2.2.3 取…

强化学习中蒙特卡罗方法

一、蒙特卡洛方法 这里将介绍一个学习方法和发现最优策略的方法&#xff0c;用于估计价值函数。与前文不同&#xff0c;这里我们不假设完全了解环境。蒙特卡罗方法只需要经验——来自实际或模拟与环境的交互的样本序列的状态、动作和奖励。从实际经验中学习是引人注目的&#x…

如何使用pngPackerGUI_V2.0,将png图片打包成plist的工具

pngPackerGUI_V2.0&#xff0c;此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小白快捷上手使用。 具体的使用步骤如下&#xff1a; 1.下载并解压缩软件&#xff0c;得到如下目录&#xff0c;双击打开 pngPackerGUI.e…

SFTP远程终端访问

远程终端访问 当服务器部署好以后&#xff0c;除了直接在服务器上操作&#xff0c;还可以通过网络进行远程连接访问CentOS 7默认支持SSH(Secure Shell, 安全Shell 协议),该协议通过高强度的加密算法提高了数据在网络传输中的安全性&#xff0c;可有效防止中间人攻击(Man-in-th…

AI绘画神器DALLE 3的解码器:一步生成的扩散模型之Consistency Models

前言 关于为何写此文&#xff0c;说来同样话长啊&#xff0c;历程如下 我司LLM项目团队于23年11月份在给一些B端客户做文生图的应用时&#xff0c;对比了各种同类工具&#xff0c;发现DALLE 3确实强&#xff0c;加之也要在论文100课上讲DALLE三代的三篇论文&#xff0c;故此文…

web:[网鼎杯 2018]Fakebook

题目 点进页面&#xff0c;页面显示为 查看源代码 用dirsearch扫一下&#xff0c;看一下有什么敏感信息泄露 扫出另一个flag.php和robots.txt&#xff0c;访问flag.php回显内容为空 请求robots.txt 网页提示/user.php.bak&#xff0c;直接访问会自动下载.bak备份文件 进行代码…

Flink在汽车行业的应用【面试加分系列】

很多同学问我为什么要发这些大数据前沿汇报&#xff1f; 一方面是自己学习完后觉得非常好&#xff0c;然后总结发出来方便大家阅读&#xff1b;另外一方面&#xff0c;看这些汇报对你的面试帮助会很大&#xff0c;特别是面试前可以看看即将面试公司在大数据前沿的发展动向&…

DevOps平台两种实现模式

我们需要一个DevOps平台 要讨论DevOps平台的实现模式&#xff0c;似乎就必须讨论它们的概念定义。然而&#xff0c;当大家要讨论它们的定义时&#xff0c;就像在讨论薛定谔的猫。 A公司认为它不过是自动化执行Shell脚本的平台&#xff0c;有些人认为它是一场运动&#xff0c;另…

代码随想录算法训练营|动态规划三十八天~四十三天

动态规划五部曲&#xff1a; 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组 三十八天 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; public class Solution {public int MonotoneIncre…

训练日志刷屏使我痛苦,我开发了VLog

训练日志刷屏使我痛苦&#xff0c;我开发了VLog&#xff0c;可以在任意训练代码中轻松使用~ 例如&#xff0c;通过callback嵌入到lightgbm/catboost/transformers/ultralytics&#xff0c;乃至keras库的训练代码流程中~ before: after&#xff1a; 为什么不用tensorboard或者wa…

Linux的make和Makefile

目录 一、 介绍二、快速使用三、依赖关系和依赖方法四、语法 一、 介绍 1、makefile带来的好处就是——“自动化编译”&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率。 2、make是一个命令工具&…