javaScript實現的數據結構

javaScripts中的函數

javaScripts中的函數沒有引用傳遞,隻有值傳遞
但是數組作為參數傳遞給函數時,此時的數組是作為地址傳遞給函數的,可以理解為引用傳遞。

變量作用域

擁有全局作用域的變量:1、在函數外定義的變量
2、在函數體內沒有經過var申明的變量
javaScripts擁有的函數作用域,沒有塊級作用域
什麼是塊級作用域:
任何一對花括號({和})中的語句集都屬於一個塊,在這之中定義的所有變量在代碼塊外都是不可見的,我們稱之為塊級作用域。
c、java等其他語言都是有塊級作用域,但是javaScript沒有塊級作用域。

#include   
void main()  
{  
   int i=2;  
   i--;  
   if(i)  
   {  
       int j=3;  
   }  
   printf("%d/n",j);  
}  

會輸出use an undefined variable:j的錯誤
但是在js中沒有塊級作用域

 function test(){
    for(var i=0;i<3;i++){
    }
    console.log(i);   //會輸出3
  }
  test();

會輸出3 在{}之外仍然可以訪問到i
遞歸

 function he(i) {
      if(i==0){
        return i;
      }
     else{
        return  i+he(i-1);
      }
   }

實現的就是從0加到5利用遞歸實現

一維數組和數組的操作方法

創建數組

   var numbers=[];
     var cc=new Array();
     console.log(cc instanceof Array)   //檢測是否為數組
      var cc=[1,'e',true];

數組中的元素可以不是數字
由字符串生成數組

  var aa="hello,jdisajd,djska";
    var cc=aa.split(",");
    console.log(cc.length)   //3

將數組轉化為字符串
使用的是join()方法和tostring()方法
join()的方法

    var aa=[1,3,6,'dda',cc];
     console.log(aa.join("c"));

輸出的結果是用C來連接數組中的每一個元素
改變數組的函數
向數組添加一個元素
push unshift

var aa=[1,3,6,'dda',cc];
    aa.push('21');   //在數組的末尾加一個元素
    aa.unshift('1212')  //在數組的開始添加一個元素

從數組中刪除一個元素

 aa.pop()  //從數組的末尾刪除一個元素
 aa.shift()  //從數組的開始刪除一個元素

從數組的中間添加或者刪除元素
splice()方法
實現為數組添加元素 需要提供一下參數
1、開始索引
2、想要刪除的元素的個數(添加是的時候為0)
3、想要添加的數組的元素

    var aa=[1,3,6,4,6];
    aa.splice(1,4,4,5,6,7);
    console.log(aa);  //[1, 4, 5, 6, 7]

第二個參數為要刪除的個數,隻是添加的話就為0,
後面的參數都是添加到數組的元素。
為數組排序
reverse()
這個方法知識實現瞭將數組的元素進行反轉。
sort()
這個方法是將數組的元素按照ACII碼來排序。但是可以改變這種排序的方式,通過傳遞一個函數。

/*    function compare(num1,num2){
       return num1-num2;
    }*/
function compare(num1,num2){
    if(num1>num2){
        return -1;
    }else{
        return 1
    }
}
    var aa=[1,3,6,12,4,6];
    aa.sort(compare);
    console.log(aa);  //[1, 4, 5, 6, 7]

上面的compare函數被傳遞給sort函數從而實現排序
迭代器方法
1、不生成新數組的迭代器
不會產生一個新的數組,但是會對數組中的每一個元素都會進行一個操作。
forEach()函數 接受的是一個函數,對數組中的每一個元素都執行這個函數

    function cc(num) {
        console.log(num*num);
    }
    var cc1=[1,2,3,4]
    cc1.forEach(cc);

every()函數 接受的是一個返回值為佈爾類型的函數。對數組每一個元素使用該函數,如果對於所有元素都返回true,該方法就會返回true,否則會返回false 與

 function cc(num) {
        return num%2==0;
    }
    var cc1=[2,4]
    console.log(cc1.every(cc));  //true

some()方法 接受的是一個返回佈爾值得函數,隻有一個元素返回true就會使得這個函數返回true 或

  function cc(num) {
        return num%2==0;
    }
    var cc1=[1,3,2,4]
    console.log(cc1.some(cc));   //true

2、生成新數組的迭代器
map() 方法 這個方法是和forEach()類似的功能,但是這個方法返回的的是一個新的數組,不會改變原來的數組。

  function cc(num) {
        return num+5;
    }
    var cc1=[1,3,2,4]
    console.log(cc1.forEach(cc));  //undefined
    console.log(cc1.map(cc));  //[6, 8, 7, 9]

filter()方法 接受的也是一個返回值為佈爾類型的函數,和every()方法不同的是當歲數組的所有的元素應用該函數時,會將結果為true的元素集合到一個數組中,會將結果為false的元素集合到一個數組中

  function even(num) {
        return num%2==0;
    }
    function odd(num) {
        return num%2==1;
    }
    var cc1=[1,3,2,4]
    console.log(cc1.filter(even));  //[2,4]
    console.log(cc1.filter(odd));  //[1,3]

indexOf()
方法著數組中的某一個元素

var aa="hello,jdisajd,djska";
    var cc=aa.split(",");
    console.log(cc.indexOf("hello"))   

二維數組

js中本身沒有二維數組,通過下邊的方法模擬創建一個二維數組

   Array.martix=function(rows,cols,init){
        var arr=[];
       for(var i=0;i

列表 list 實現的是索引列表

js中列表可以是任意的數據類型 這裡寫圖片描述 用js實現列表和對列表的操作 https://github.com/wenjuanzhao/git/blob/master/3.1-list.js

棧 -元素先進後出

js實現棧的數據結構 https://github.com/wenjuanzhao/git/blob/master/3.2-stack.js 棧是一種特殊的列表 棧內的元素隻能在一端訪問元素。這一端稱為棧頂 使用棧實現數值之間的進制轉換

  function mulBase(num,base) {
      var s=new stack();
      do{
          s.push(num%base);
          num=Math.floor(num/base);
      }while(num>0)
      return s;
  }
  var cc="";
    var ss=mulBase(12,2);
   while(ss.length()>0){
       cc+=ss.pop();
   }
    console.log(cc);

使用棧來實現遞歸的過程

  function ff(n){
        var s=new stack();
        while(n>1){
            s.push(n--);
        }
        var product=1;
        while(s.length()>0){
            product*=s.pop();
        }
        return product;
    }
    console.log(ff(5));

使用棧實現瞭檢測一個表達式中的括號是否匹配

 function validBraces(str) {
     let brackets = str.match(/[\[\]\(\)\{\}]/g),
             ss=new stack(), symbal;
     for(var i=0;i0?false:true;
 }
    console.log(validBraces("2.3+23/12+{((1))}"))

隊列

先進先出的數據結構
使用node從文件讀取跳舞者 的姓名和性別,js實現隊列的算法來實現跳舞排隊。一男一女一個組合剩下的男或者女按照隊列的規則在排隊
https://github.com/wenjuanzhao/git/tree/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.1-queue
隊列實現基數排序
基數排序:https://baike.baidu.com/link?url=GjmU4fcHfrE0ls_w2fT8lxGjZwQoK9hapNCtU0b2up5Iax1Fp_UOs7oz7FxZA8kyGon0vs5rudQHw1rydm37G_
js利用實現基數排序:要實現這個算法需要9個隊列。
https://github.com/wenjuanzhao/git/blob/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.4-queue.js

delete刪除操作符

delete用於刪除對象的屬性但是不能刪除變量和函數

    var o={x:1};
     //使用瞭delete來刪除瞭對象的屬性
    delete o.x;
    console.log(o.x)  //undefined
    function aa(){
        return 1;
    }
     //使用delete不能刪除不瞭這個函數也刪除不瞭定義的變量
    delete aa;
    console.log(typeof aa);  //function

鏈表

數組的缺點:在很多編程語言中數組的長度是固定的,
1、當數組中的被填滿的時候,很難再擴充數組的長度,
2、數組中添加和刪除都是比較困難的,因為一旦刪除或者添加都必須移動其他的元素
所以在很多的編程語言中就封裝瞭鏈表
鏈表是一個一個節點組成的集合
每一個節點都使用一個對象的引用指向它的後繼。
頭節點:鏈表最前面的一個特殊的節點。
設計一個基於對象的鏈表
註意:向鏈表中插入節點的時候1、首先創建一個節點,並將鏈表的頭節點賦給新節點2、在鏈表上進行循環,如果當前的element屬性和我們要找的信息不符,就從當前的節點移動到下一個節點。3、一旦找到可以插入的位置,首先將next屬性設置為後面節點next屬性對應的值。
實現插入的關鍵性語句
newNode.next=current.next;
current.next=newNode;
實現刪除某個節點的時候必須是先找到被刪除節點的前一個節點,用findPrev這個方法來找到
js實現單向鏈表
https://github.com/wenjuanzhao/git/blob/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.5-%E5%8D%95%E5%90%91%E9%93%BE%E8%A1%A8.js
js實現雙向鏈表
這裡寫圖片描述
改變瞭每一個節點的具體結構
https://github.com/wenjuanzhao/git/blob/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.6-%E5%8F%8C%E5%90%91%E5%88%97%E8%A1%A8.js
js實現循環列表vc3Ryb25nPjxiciAvPg0KPGltZyBhbHQ9"這裡寫圖片描述" src="/uploadfile/Collfiles/20160920/20160920093450223.png" title="\" />
循環鏈表和單向鏈表相似, 節點類型都是一樣的。 唯一的區別是, 在創建循環鏈表時, 讓其頭節點的 next 屬性指向它本身, 即:
head.next = head
讓你果然有錯誤的約瑟夫問題

字典

字典是一種以鍵、值的方式存儲的一種數據結構。

發佈留言