「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
虽然前端不需要深入学习算法,但是想要更好得提升自己,我认为算法也是十分必要的,这里我们的语言使用JavaScript
算法太多太多太多。。。。。。了,我只是想吧自己学到的东西分享出来并是想教会大家,同时也锻炼一下自己的语言梳理能力
为了学习算法,我特意买了一本《JavaScript数据结构》,我也不知道有没有用,反正花了两三天把它看完了没有写,当然提升基本等于0,看完不会写等于白看,所以我又用了将近半个月的时间来写JavaScript数据结构的算法
对了那本书就长这样
JavaScript是当下最流行的编程语言之一。由于浏览器的原生支持(无需安装任何插件),JavaScript也被称为“互联网语言”。JavaScript的应用非常广泛,不仅用于前端开发,也被用到服务器(nodejs)环境、数据库(mongodb)环境和移动设备中,同样还被用在嵌入式设备和物联网(IoT)设备中
对于任何专业技术人员来说,理解数据结构都非常重要。作为软件开发者,我们要能够借助编译程序来解决问题,而数据结构是这些问题的解决方案中不可缺啥的一部分。如果选择了不恰当的数据结构,可能会导影响所写的性能。因此,理解不同的数据结构和他们的使用范围非常重要。
算法在计算机科学中扮演着非常重要的角色。解决一个问题有很多种方法,但有些方法会比其他方法好用。因此,了解一下最著名的算法也很重要 废话不多说,开始搞
一.栈
import { Queue } from "../queue/queue";
export class Stack {
constructor() {
this.items = []
}
//push(element) 添加一个新的元素到栈顶位置
push(element) {
this.items.push(element);
}
//pop() 移除栈顶的元素,同时返回被移除的元素(出栈) pop() 方法用于删除并返回数组的最后一个元素。
pop() {
return this.items.pop();
}
//peek() 返回栈顶元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)
peek() {
if(this.isEmpty()) return null
return this.items[this.items.length - 1];
}
//isEmpty() 如果栈里没有任何元素就返回true,否则返回false
isEmpty() {
return this.items.length === 0;
}
//size() 返回栈元素的个数
size() {
return this.items.length;
}
}
//十进制转二进制
export function dec2bin(num) {
//1.创建一个栈结构
const stack = new Stack();
//2.循环while
while(num > 0) {
let remainder = num % 2; //获得到余数
num = Math.floor(num / 2);//向下取整 直到num等于0
stack.push(remainder); //将余数压入栈
}
//返向拼接字符串
let binString = "";//定义一个新的字符串用于反向拼接
while(!stack.isEmpty()) {//循环直到栈为空栈
binString += stack.pop();//移出顶栈元素到字符串中 进行拼接
}
//返回获取的字符串
return binString;
}
二.队列
export class Queue {
constructor() {
this.items = []
}
//enqueue(element): 向队列尾部添加一个(或多个)新的项
enqueue(element) {
this.items.push(element)
}
//dequeue(): 移除队列中的第一项 (即排在队列最前面的)项,并返回被移出的元素
dequeue() {
return this.items.shift()
}
//front(): 返回队列中第一个元素--最先被添加,也是最先被移出的元素。队列不做任何变动
front() {
if(this.isEmpty() === 0) return null;
return this.items[0]
}
//isEmpty(): 空队列返回true 否则返回false
isEmpty() {
return this.items.length === 0
}
//size(): 返回队列包含的元素个数,与数组length很像
size() {
return this.items.length
}
}
//优先级队列
class QueueElement {//构造函数,构造器进行
constructor(element, priority) {
this.element = element;
this.priority = priority;
}
}
export class PriorityQueue extends Queue{
enqueue(element, priority) {
//1.创建QueueElement对象
const queueElement = new QueueElement(element, priority);
//2.考虑如何插入新的元素
if(this.isEmpty()) {//判断数组是否为空
this.items.push(queueElement)//插入
}else {
let added = false;
for(let i = 0; i < this.size(); i++) {
if(this.items[i].priority > queueElement.priority) {//进行比较,依次与数组priority进行对比,当对比到大于他的时候,放在该数组前面
this.items.splice(i, 0, queueElement);//在指定位置插入queueElement元素
added = true; //最后都没有进入if语句,证明数据priority优先级最高,added不改变
break;
}
}
if(!added) {//当added没改变时,取反为true并push进入数组
this.items.push(queueElement);
}
}
}
}
//击鼓传花算法
export function passGame(nameList, num) {
const queue = new Queue()
for(let i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i])
}
while(queue.size() > 1) {
for(let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
queue.dequeue()
}
return queue.front()
}
//1.先创建一个队列并且赋值 //2.循环让这些人进入队列中
当然由于时间问题,我下来慢慢再给大家讲这些是怎么写出来的。(可能明天,long long time)哈哈哈。。