javascript數據結構

學習數據結構很是重要。首要緣由是數據結構和算法能夠很高效的解決常見問題。做爲前端,經過javascript學習數據結構和算法要比學習java和c版本容易的多。javascript

在講數據結構以前咱們先了解一下ES6的一些方法。由於這可能對咱們瞭解數據結構有幫助。前端

ES6操做數組的方法

首先咱們來用箭頭函數定義一個函數。java

const isEven = x => x % 2 === 0;
let numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

1.event方法迭代

此方法會迭代數組中每一個元素,若是每一個元素都返回true,此方法纔會返回true.算法

numbers.every(isEven);

由於並非每一個數字都是偶數。因此返回false;數組

2.some方法迭代

此方法會迭代數組中每一個元素,若是有元素都返回true,此方法纔會返回true.數據結構

numbers.some(isEven);

由於有偶數元素,因此返回true;數據結構和算法

3.forEach方法迭代

此方法會迭代數組中的每一個元素,而後分別執行傳入的回到函數。函數

number.forEach(callback);

4.map方法迭代

此方法會將數組的每一個元素經過回調函數,並將每一個返回值組成新的數組返回。學習

numbers.map(isEven);

返回[false,true,false,true,false,true,false,true,false,true,false,true,false,true,false];this

5.filter方法迭代

此方法返回的新數組由使回調函數返回true的元素組成。

numbers.filter(isEven);

由於2,4,6,8,10,12,14模2等於0;因此返回[2,4,6,8,10,12,14];

6.reduce方法迭代

此方法有四個參數previousValue,currentValue,index,array.後連個參數爲可選參數,能夠不傳。這個函數會返回一個將被疊加到疊加器的值。

numbers.reduce((previous, current) => previous + current)

咱們來分解一下reduce執行過程。第一個previous爲1,current爲2 return爲1+2=3。在第二次迭代中previous爲上一個迭代的返回值3,current爲3, return爲6 …所以最後返回120。

除此以外,ES6還新增了不少語法糖。有興趣的同窗能夠去阮大神的我的博客。

1.什麼是棧?

基礎的東西簡單的介紹完了,接下來咱們來點乾貨。那麼什麼是棧呢?棧是一種聽從後進先出(LIFO)原則的有序集合。新添加和待刪除的元素都保存在棧的同一端,稱做棧頂,另外一端就叫棧底。在棧裏,新元素都靠近棧頂,舊元素都接近棧底。就像生活中廚房裏疊放的盤子。

2.建立基於JavaScript數組的棧

先從聲明一個Stack類開始。

class Stack {
  constructor() {
    this.items = [];
  }
}

接下來咱們添加一些方法。

  • 1.push(element);添加元素到棧頂
  • 2.pop();移除棧頂元素,並返回移除元素
  • 3.peek();返回棧頂的元素
  • 4.isEmpty();若是站裏沒有元素則按返回true,反之返回false
  • 5.clear();移除棧裏全部元素
  • 6.size();返回棧裏元素個數

push方法

push(element) {
  this.items.push(element);
}

pop方法

pop() {
  return this.items.pop();
}

peek方法

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

isEmpty方法

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

clear方法

clear() {
  this.items = [];
}

size方法

size() {
  return this.items.length;
}

3.建立基於JavaScript對象的棧

先從聲明一個Stack類開始。

class Stack {
  constructor() {
    this.count = 0;
    this.items = {};
  }
}

接下來咱們添加一些方法。

  • 1.push(element);添加元素到棧頂
  • 2.pop();移除棧頂元素,並返回移除元素
  • 3.peek();返回棧頂的元素
  • 4.isEmpty();若是站裏沒有元素則按返回true,反之返回false
  • 5.clear();移除棧裏全部元素
  • 6.size();返回棧裏元素個數

push方法

push(element) {
  this.items[this.count] = element;
  this.count ++;
}

pop方法

pop() {
  if(this.isEmpty()) {
    return undefined;
  }
  this.count --;
  let result = this.items[this.count];
  delete this.items[this.count]
  return result;
}

peek方法

peek() {
  if(this.isEmpty()) {
    return undefined;
  }
  return this.items[this.count - 1];
}

isEmpty方法

isEmpty() {
  return this.count == 0;
}

clear方法

clear() {
  this.count = 0;
  this.items = {};
}

size方法

size() {
  return this.items.count;
}

toString方法

由於數組版本的棧的toString()方法能夠直接使用數組提供的toString方法,爲對象版則須要咱們本身封裝。

toString() {
  if(this.isEmpty()) {
    return ''
  }
  let objString = `${this.items[0]}`;
  for(let i=1; i<this.count; i++) {
    objString = `${objString},${this.items[i]}`
  }
  return objString;
}

這就是咱們用javascript版本的棧數據結構。

4.用棧解決問題

下面咱們以10進制轉2進製爲例,看看如何用棧決絕問題。

function decimalToBinary(decNumber) {
  const remStack = new Stack();
  let number = decNumber;
  let rem;
  let binaryString = '';
  while(number > 0) {
    rem = Math.floor(number % 2);
    remStack.push(rem);
    number = Math.floor(number / 2);
  }
  if(!remStack.isEmpty()) {
    binaryString += this.pop().toString();
  }
  return binaryString;
}

這即是用數據結構解決問題。後續我會將用JavaScript講解什麼是隊列、鏈表、集合、字典、哈希表(HashTable)、遞歸、樹、二叉堆、圖等數據結構。

 

原創博客:轉載請註明:javascript數據結構 – 棧

相關文章
相關標籤/搜索