Stack 棧
var Stack = function(){
var items = []
//私有屬性,禁止直接外部訪問,只能調用接口
// push 棧頂添加元素
this.push = function(element){
items.push(element)
}
// pop 移除棧頂元素
this.pop = function(){
return items.pop()
}
// peek 檢查棧頂
this.peek = function(){
return items[items.length - 1]
}
// 檢查棧 是否爲空
this.isEmpty = function(){
return items.length == 0
}
// 清除棧
this.clear = function(){
items = []
}
// 獲取棧的大小
this.length = function(){
return items.length
}
// 檢查items
this.getItems = function(){
return items
}
}
複製代碼
Queue 隊列
var Queue = function(){
var items = []
//入隊
this.enqueue = function(element){
items.push(element)
}
// 出隊
this.dequeue = function(){
return items.shift()
}
//查看隊列頭
this.front = function(){
return items[0]
}
//檢查隊列是否爲空
this.isEmpty = function(){
return items.length === 0
}
//隊列大小
this.size = function(){
return items.length
}
}
複製代碼
PriorityQueue 優先隊列
var PriorityQueue = function(){
var items = []
// 數據+優先級
var QueueItem = function(element,priority){
this.element = element
this.priority = priority
}
this.enqueue = function(element,priority){
var queueItem = new QueueItem(element,priority)
var added = false
for(var i = 0 ; i < items.length ; i++){
if(queueItem.priority > items[i].priority){
items.splice(i,0,queueItem)
added = true
break
}
}
if(!added){
items.push(queueItem)
}
}
this.getItems = function(){
return items
}
}
複製代碼
Set 集合
- 我寫的和網上其餘方法不同,
- ES6的Set支持去重,並防止對象轉化成爲[object Obeject]
function mySet() {
var set = [];
// this.set = set;
//製做函數時方便檢查用的
//避免暴露給用戶
this.add = function (item) {
if (!this.has(item)) {
console.log(item)
set.push([item])
}
}
this.has = function (item) {
for (var i = 0; i < set.length; i++) {
if (set[i][0] === item) {
return true;
}
}
return false;
}
this.get = function (item) {
var arr = [];
for (var i = 0; i < set.length; i++) {
arr.push(set[i][0])
}
return arr;
}
this.size = function (item) {
return set.length;
}
this.clear = function () {
items = [];
return true
}
if (arguments) {
for (var i = 0; i < arguments[0].length; i++) {
this.add(arguments[0][i])
}
}
}
// 測試
var obj = { name: 'obj' }
var oSet = new mySet([1, 2, obj,{}]);
oSet.add(function () { });
oSet.add({ name: "lyz" });
oSet.add(obj);
console.log(oSet);
複製代碼
Map 字典
class myMap {
constructor() {
//初始化桶
this.bucket = new Array(8);
for (var i = 0; i < this.bucket.length; i++) {
this.bucket[i] = {
type: 'bucket_' + i,
next: null
}
}
}
makeHash(key) {
// 根據類型產生哈希
var hash = 0;
if (typeof key !== 'string') {
if (typeof key === 'number') {
hash = Object.is(NaN, key) ? 0 : key;
} else if (typeof key == 'object') {
hash = 0;
} else if (typeof key == 'boolean') {
hash = +key;
} else {
//function undefined symbol()
hash = 8;
}
} else {
//若是是string
for (var i = key.length - 1; i > key.length - 4; i--) {
if (key[i]) {
hash += key[i].charCodeAt(0)
}
}
}
hash = hash % 8;
console.log(hash)
return hash;
}
get(key) {
let hash = this.makeHash(key);
//遊標 桶
var oTempBucket = this.bucket[hash];
while (oTempBucket) {
if (oTempBucket.next.key == key) {
//若是已經存在
return oTempBucket.next.value
}
oTempBucket = oTempBucket.next;
}
}
set(key, value) {
let hash = this.makeHash(key);
var oTempBucket = this.bucket[hash];
while (oTempBucket.next) {
//查找
if (oTempBucket.next.key == key) {
//若是已經存在
oTempBucket.next.key == key
} else {
//若是不存在, 臨時桶的next爲空,下一步跳出循環
oTempBucket = oTempBucket.next;
}
}
//對空桶初始化賦值
oTempBucket.next = {
key,
value,
next: null
}
}
has(key) {
let hash = this.makeHash(key);
//遊標桶
var oTempBucket = this.bucket[hash];
while (oTempBucket) {
if (oTempBucket.next && oTempBucket.next.key == key) {
//若是已經存在
return true
}
oTempBucket = oTempBucket.next;
}
return false;
}
delete(key) {
let hash = this.makeHash(key);
//遊標桶
var oTempBucket = this.bucket[hash];
while (oTempBucket.next) {
// 判斷下一個的key是不是
if (oTempBucket.next.key == key) {
console.log(oTempBucket, oTempBucket.next.next)
//當前的這個denext等於下一個的下一個
oTempBucket.next = oTempBucket.next.next;
return true;
}
oTempBucket = oTempBucket.next;
}
return false;
}
clear() {
this.bucket = new Array(8);
for (var i = 0; i < this.bucket.length; i++) {
this.bucket[i] = {
type: 'bucket_' + i,
next: null
}
}
}
}
複製代碼
二叉樹
複製代碼
圖
複製代碼