数据结构&算法 学习

本文深入探讨了数据结构的基础,包括顺序表、链表的定义和操作方法,如添加、插入、删除等。接着介绍了队列的实现,包括入队、出队等操作。栈的使用,如压栈、弹栈、查看栈顶元素等。还讨论了字典和散列表的概念,提供了相关操作如设置键值、删除键值、获取键值等。文章最后提及了单调队列和单调栈以及树与二叉树等高级数据结构,为读者提供了全面的数据结构知识概览。
摘要由CSDN通过智能技术生成

算法学习

顺序表

数据结构

顺序表就是我们常用的数组

Array 

代码展示

链表

链表结构及方法成员

在实现这些方法之前,先来看看它们的职责。

 append(element):向列表尾部添加一个新的项。
 insert(position, element):向列表的特定位置插入一个新的项。
 remove(element):从列表中移除一项。
 indexOf(element):返回元素在列表中的索引。如果列表中没有该元素则返回-1。
 removeAt(position):从列表的特定位置移除一项。
 isEmpty():如果链表中不包含任何元素,返回true,如果链表长度大于0则返回false。
 size():返回链表包含的元素个数。与数组的length属性类似。
 toString():由于列表项使用了Node类,就需要重写继承自JavaScript对象默认的
toString方法,让其只输出元素的值。

代码展示

function LinkedList() {
 let Node = function(element){ 
   this.element = element;
   this.next = null;
 };
 let length = 0; 
 let head = null; 
 this.append = function(element){};
 this.insert = function(position, element){};
 this.removeAt = function(position){};
 this.remove = function(element){};
 this.indexOf = function(element){};
 this.isEmpty = function() {};
 this.size = function() {};
 this.getHead = function(){};
 this.toString = function(){};
 this.print = function(){};
}

实现



队列

我们需要创建自己的类来表示一个队列。先从最基本的声明类开始:
function Queue() {
//这里是属性和方法
}
首先需要一个用于存储队列中元素的数据结构。我们可以使用数组,就像在上一章Stack类
中那样使用(你会发现Queue类和Stack类非常类似,只是添加和移除元素的原则不同):
let items = [];
接下来需要声明一些队列可用的方法。
 enqueue(element(s)):向队列尾部添加一个(或多个)新的项。
 dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
 front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不
做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。
 isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
 size():返回队列包含的元素个数,与数组的length属性类似。

数据结构

代码展示

我们将创建一个类来表示栈。让我们从基础开始,先声明这个类:
function Stack() {
//各种属性和方法的声明
}
首先,我们需要一种数据结构来保存栈里的元素。可以选择数组:
let items = [];
接下来,要为我们的栈声明一些方法。
push(element(s)):添加一个(或几个)新元素到栈顶。
pop():移除栈顶的元素,同时返回被移除的元素。
peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返
回它)。
isEmpty():如果栈里没有任何元素就返回true,否则返回false。
clear():移除栈里的所有元素。
size():返回栈里的元素个数。这个方法和数组的length属性很类似。

代码展示

let Stack = (function () {
  const items = new WeakMap();
  class Stack {
    constructor () {
      items.set(this, []);
    }
    //其他方法
    push(element){
      let s = items.get(this); //{3}
 			s.push(element);
    }; 

    pop(){
     let s = items.get(this);
     let r = s.pop();
     return r; 
    };

    peek(){
     return items[items.length-1];
    }; 

    isEmpty(){
     return items.length == 0;
    }; 

    size(){
     return items.length;
    }; 

    clear(){
     items.set(this, []);
    }; 

    print(){
     console.log(items.toString());
    };
  }
  return Stack; 
})(); 

字典

这是我们的Dictionary类的骨架:
function Dictionary() {
var items = {};
}
与Set类类似,我们将在一个Object的实例而不是数组中存储元素。
然后,我们需要声明一些映射/字典所能使用的方法。
 set(key,value):向字典中添加新元素。
 delete(key):通过使用键值来从字典中移除键值对应的数据值。
 has(key):如果某个键值存在于这个字典中,则返回true,反之则返回false。
 get(key):通过键值查找特定的数值并返回。
 clear():将这个字典中的所有元素全部删除。
 size():返回字典所包含元素的数量。与数组的length属性类似。
 keys():将字典所包含的所有键名以数组形式返回。
 values():将字典所包含的所有数值以数组形式返回。

散列表

我们将使用数组来表示我们的数据结构,该数据结构和上一章中的图表所用的非常相似。
和之前一样,我们从搭建类的骨架开始:
function HashTable() {
var table = [];
}
然后,给类添加一些方法。我们给每个类实现三个基本方法。
 put(key,value):向散列表增加一个新的项(也能更新散列表)。
 remove(key):根据键值从散列表中移除值。
 get(key):返回根据键值检索到的特定的值。
在实现这三个方法之前,要实现的第一个方法是散列函数,它是HashTable类中的一个私有
方法:
var loseloseHashCode = function (key) {
var hash = 0; //{1}
for (var i = 0; i < key.length; i++) { //{2}
hash += key.charCodeAt(i); //{3}
}
return hash % 37; //{4}
};

更好的散列函数

var djb2HashCode = function (key) {
 var hash = 5381;
 for (var i = 0; i < key.length; i++) {
 hash = hash * 33 + key.charCodeAt(i);
 }
 return hash % 1013;
}; 

单调队列

数据结构

代码展示

单调栈

数据结构

代码展示

树与二叉树

数据结构

代码展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从未、淡定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值