• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    js棧、隊列、鏈表數據結構的實現代碼分享

    來源:懂視網 責編:小采 時間:2020-11-27 20:03:10
    文檔

    js棧、隊列、鏈表數據結構的實現代碼分享

    js棧、隊列、鏈表數據結構的實現代碼分享:數據結構有講過,棧是一種遵從后進先出原則的有序集合,書中對棧的形容非常到位,就像是堆盤子,先放的肯定在下面的位置,最上面的是才放的。給棧內添加元素,最先添加的在棧底,最后一個加進去的稱為棧頂元素。js實現棧及其方法具體內容有創建棧:在js里我們
    推薦度:
    導讀js棧、隊列、鏈表數據結構的實現代碼分享:數據結構有講過,棧是一種遵從后進先出原則的有序集合,書中對棧的形容非常到位,就像是堆盤子,先放的肯定在下面的位置,最上面的是才放的。給棧內添加元素,最先添加的在棧底,最后一個加進去的稱為棧頂元素。js實現棧及其方法具體內容有創建棧:在js里我們

    數據結構有講過,棧是一種遵從后進先出原則的有序集合,書中對棧的形容非常到位,就像是堆盤子,先放的肯定在下面的位置,最上面的是才放的。給棧內添加元素,最先添加的在棧底,最后一個加進去的稱為棧頂元素。

    js實現棧及其方法

    具體內容有

  • 創建棧:在js里我們用數組類比棧

  • 向棧里添加元素push()

  • 移除元素 delete()

  • 棧大小 size()

  • 查看棧頂元素 peek()

  • 檢查棧是否為空 isEmpty()

  • 清空棧 empty()

  • 打印棧 print()

  • 使用

  • 代碼

     function Stack(){
     var stack=[]; this.push=function(para){
     stack.push(para);
     }; this.delete=function(){
     // 刪除棧頂元素
     stack.pop();//刪除數組末尾元素,
     } this.size=function(){
     return stack.length;
     } this.peek=function(){
     return stack[stack.length-1];
     } this.isEmpty=function(){
     if(stack.length==0){ return true;
     }else{ return false;
     }
     } this.emptyStack=function(){
     stack=[];
     } this.print=function(){
     return stack.toString();
     }
    }

    使用

    var myStack=new Stack();
    myStack.push(1);
    myStack.push(4);
    myStack.push(6);
    console.log('刪除前棧內元素'+myStack.print());
    console.log('刪除前棧頂元素'+myStack.peek());
    console.log('刪除前棧元素size'+myStack.size());
    myStack.delete();
    console.log('刪除后棧內元素'+myStack.print());
    console.log('刪除后棧頂元素'+myStack.peek());
    console.log('刪除前棧元素size'+myStack.size());
    console.log('棧是否為空'+myStack.isEmpty());
    myStack.emptyStack();
    console.log('清空棧,棧是否為空'+myStack.isEmpty());
    console.log('清空棧,棧元素size'+myStack.size());

    這里寫圖片描述

    隊列

    先進先出,就像喝孟婆湯要排隊一樣,先來的排在前面,后面來的就排在隊尾,要投胎肯定是前面喝完的人去,操作隊列也一樣,從隊列前面移除元素,從隊尾添加元素。和棧的實現大同小異

    function Queue(){
     var queue=[]; this.push=function(para){
     queue.push(para);
     } this.delete=function(){
     // 從隊首移除,即刪除的是數組第一位
     queue.shift();
     } this.queueFront=function(){
     return queue[0];
     } this.isEmpty=function(){
     if(queue.length==0){ return true;
     }else{ return false;
     }
     } this.size=function(){
     return queue.length;
     } this.emptyQueue=function(){
     queue=[];
     } this.print=function(){
     return queue.toString();
     }
    }var myQueue=new Queue();
    myQueue.push(1);
    myQueue.push(4);
    myQueue.push(6);
    console.log('刪除前隊列內元素'+myQueue.print());
    console.log('刪除前隊列頂元素'+myQueue.queueFront());
    console.log('刪除前隊列元素size'+myQueue.size());
    myQueue.delete();
    console.log('刪除后隊列內元素'+myQueue.print());
    console.log('刪除后隊列頂元素'+myQueue.queueFront());
    console.log('刪除前隊列元素size'+myQueue.size());
    console.log('隊列是否為空'+myQueue.isEmpty());
    myQueue.emptyQueue();
    console.log('清空隊列,隊列是否為空'+myQueue.isEmpty());
    console.log('清空隊列,隊列元素size'+myQueue.size());

    這里寫圖片描述

    實現的不同點

    刪除操作和訪問隊首(棧頂)元素的方法不一樣,這是由于后進先出和先進先出的原則不同造成的,棧刪除的是數組最后一位( pop() ),隊列刪除數組的第一位(shift()),棧頂元素是數組最后一位,而隊列的隊首元素是數組第一位元素。

    書上有用ES6的新特性寫的實現方式,emmmm我ES6不甚了解,等以后以后以后~~~

    補充,優先隊列

    說白了就是有特權,書中規定優先級小的在前面。然后自己實現了一下,代碼和書中不太一樣,兩個都運行了一下
    先貼一下書上的代碼

    function PriorityQueue(){
     let items=[]; function QueueElement(element,priority){
     this.element=element; this.priority=priority;
     } this.enqueue=function(element,priority){
     let queueElement=new QueueElement(element, priority); let added=false; for(let i=0;i<items.length;i++){ if(queueElement.priority<isFinite([i].priority)){
     items.splice(i,0,queueElement);
     added=true; break;
     }
     } if(!added){
     items.push(queueElement);
     }
     }; this.print=function(){
     return items;
     }
    }var pq=new PriorityQueue();
    pq.enqueue('aa',2);
    pq.enqueue('aba',4);
    pq.enqueue('jjjj',8);
    pq.enqueue('aaaaaaa',8);
    pq.enqueue('aa',-1);
    console.log(pq.print());

    這里寫圖片描述

    function PriorityQueue(){
     // 按優先級從小到大排列,
     var queue=[]; function QueueElement(ele,prior){
     this.element=ele; this.prior=prior;
     } this.enqueue=function(ele,prior){
     //循環遍歷隊列內所有元素,如果當前優先級小,則放在該位之前
     var curr=new QueueElement(ele, prior); if(queue.length==0){
     queue.push(curr);
     }else{ if(curr.prior<=queue[0].prior){
     queue.splice(0,0,curr);
     }else{
     queue.push(curr);
     }
     }
     } this.print=function(){
     return queue;
     }
    }var pq=new PriorityQueue();
    pq.enqueue('aa',2);
    pq.enqueue('aba',4);
    pq.enqueue('jjjj',8);
    pq.enqueue('aaaaaaa',8);
    pq.enqueue('aa',-1);
    console.log(pq.print());

    這里寫圖片描述

    嗷嗷嗷 截完圖才發現最后應該輸出element,不要優先級,這里補一下上面兩個的print方法(注意,我聲明的是queue,書中是items ^_^)

    this.print=function(){
     var result=[]; for(let j = 0, length2 = items.length; j < length2; j++){
     result[j]=items[j].element;
     }
     return result;
     }

    鏈表

    鏈表存儲有序的元素集合,但不同于數組的是,鏈表中的元素并不是連續放置的。每個元素由存儲元素本身的節點和一個指向下一個元素的引用(指針)構成,

    單鏈表

    鏈表類的方法都有:

    append(para) 在鏈表尾部添加元素appendAt(element,index) 在指定位置添加元素deleteAt(index) 刪除指定位置的鏈表元素getHead() 獲得鏈表頭元素size() 獲得鏈表大小print() 打印出鏈表內容 
    
    toString() 
    輸出鏈表元素的內容indexOf(para) 查找元素如果在鏈表中找到了就返回他的位置,沒找到就返回-1isEmpty() 判斷鏈表是否為空size() 獲取鏈表長度

    具體代碼

    因為是寫一段測試一段,所以函數沒在一起寫,先分開后面再匯總。

    function LinkList(){
     let Node=function(element){
     this.element=element; this.next=null;
     }; var list=[];
     let length=0;
     let head=null;
     let currNode=null; this.append=function(para){
     //鏈表尾部追加元素
     var node=new Node(para); var current;//一直指向上一個添加的節點
     if(head==null){ //插入第一個元素
     head=node;
     currNode=head; // console.log(head);
    
     }else{ //不是第一個元素
     //上一個的next指針指向當前node;
     currNode.next=node; // console.log(currNode);
     currNode=node;
     }
     length++; // list.push(node);
     } this.getHead=function(){
     return head;
     } this.appendAt=function(element,index){
     if(index>=0 && index<=length){ var node=new Node(element); var current=head; var previous; var position=0; if(index==0){
     node.next=current;
     head=node;
     }else{ while(position++<index){
     previous=current;
     current=current.next
     }
     node.next=current;
     previous.next=node;
     }
     length++; // return 
     }else{
     alert("參數錯誤");
     }
     } this.deleteAt=function(index){
     //從特定位置移除一個元素,index索引
     if(index>=0 && index<length){ var previousNode=null; var node=head; var position=0; if(index==0){
     head=node.next; return node.element;
     }else{ // console.log(node);
     while(position++<index){ // console.log(node);
     previousNode=node;
     node=node.next;
     }
     previousNode.next=node.next; return node.element;
     }
     }else{
     alert("參數不正確!"); return null;
     }
    
     length--;
     } this.size=function(){
     return list.length;
     } this.print=function(){
     var result=[]; for(let i = 0, length1 = list.length; i < length1; i++){
     result[i]=list[i];
     } return result;
     }
    }
    var linkList=new LinkList();
    linkList.append('lorry1');
    linkList.append('lorry2');
    linkList.append('lorry3');
    linkList.appendAt('lorry4',0);
    
    linkList.appendAt('lorry5',0);// 那么當前鏈表的元素順序是 lorry5,lorry4,lorry1,lorry2,lorry3console.log(linkList.deleteAt(2));
    console.log(linkList.getHead().next);//獲取頭元素的下一個元素
    控制臺打印出來的內容:lorry1 linkList.js:112 Node {element: "lorry4", next: Node} linkList.js:115 
     element:"lorry4"
     next:Node {element: "lorry2", next: Node}
     __proto__:Object

    這里寫圖片描述
    toString,size,indexOf方法

    this.toString=function(){
     var current=head; var str=''; var i=0; while(current){
     str+=current.element+' ';
     current=current.next;
     } return str;
     } this.indexOf=function(para){
     //返回首個出現該參數的位置
     var current=head; var index=-1; // var i=0;
     while(current){
     index+=1; if(current.element==para){ return index;
     }
     current=current.next;
     } return -1;
     } this.isEmpty=function(){
     return length==0;
     } this.size=function(){
     return length;
     }
    var linkList=new LinkList();
    linkList.append('lorry1');
    linkList.append('lorry2');
    linkList.append('lorry3');
    linkList.appendAt('lorry4',0);
    linkList.appendAt('lorry5',1);
    
    linkList.appendAt('lorry5',0);console.log('我刪除了...'+linkList.deleteAt(1));console.log('頭元素下一個元素是...'+linkList.getHead().next.element);console.log('刪除后鏈表內容...'+linkList.toString());console.log('lorry5在鏈表中的位置...'+linkList.indexOf('lorry5'));console.log('lorriy5在鏈表中的位置....'+linkList.indexOf('lorriy5'));console.log('鏈表長度...'+linkList.size());
    linkList.js:143 我刪除了...lorry4linkList.js:145 頭元素下一個元素是...lorry5linkList.js:146 刪除后鏈表內容...lorry5 lorry5 lorry1 lorry2 lorry3 
    linkList.js:147 lorry5在鏈表中的位置...0linkList.js:148 lorriy5在鏈表中的位置....-1linkList.js:150 鏈表長度...5

    這里寫圖片描述

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    js棧、隊列、鏈表數據結構的實現代碼分享

    js棧、隊列、鏈表數據結構的實現代碼分享:數據結構有講過,棧是一種遵從后進先出原則的有序集合,書中對棧的形容非常到位,就像是堆盤子,先放的肯定在下面的位置,最上面的是才放的。給棧內添加元素,最先添加的在棧底,最后一個加進去的稱為棧頂元素。js實現棧及其方法具體內容有創建棧:在js里我們
    推薦度:
    標簽: 實現 js 代碼
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 99久久精品久久久久久清纯| 精品久久久久久国产免费了| 欧美一区二区精品久久| 亚洲综合无码精品一区二区三区| 91亚洲精品麻豆| 成人国内精品久久久久影院| 亚洲乱码精品久久久久..| 国产精品亚洲玖玖玖在线观看| 99久久婷婷免费国产综合精品| 亚洲AV日韩精品久久久久久久| 欧美国产成人精品一区二区三区 | 欧美亚洲成人精品| 99久久精品国产一区二区蜜芽| 国产精品国产亚洲精品看不卡| 亚洲精品无码Av人在线观看国产| 人妻少妇精品久久| 久久精品国产亚洲AV不卡| 国产精品美女久久久久av爽| 亚洲一二成人精品区| 国产精品视频一区二区三区经| 国产精品乱码高清在线观看| 日韩精品无码一区二区中文字幕| 中文字幕一精品亚洲无线一区| 亚洲国产人成精品| 欧美精品福利视频一区二区三区久久久精品| 99riav国产精品| 99热精品久久只有精品| 亚洲午夜精品一区二区| 欧美精品一区二区精品久久| 精品日产一区二区三区手机| 精品视频在线免费观看| 国产精品日本欧美一区二区| 99热门精品一区二区三区无码| 国产午夜精品免费一区二区三区| 国产三级精品三级在线专区1 | 亚洲欧美日韩国产精品一区二区| 欧美精品黑人粗大欧| 日韩精品欧美国产在线| 欧美日韩成人精品久久久免费看| 欧美成人精品第一区二区| 香港三级精品三级在线专区|