ホームページ > ウェブフロントエンド > jsチュートリアル > JS スタック、キュー、リンク リスト データ構造の実装コード共有

JS スタック、キュー、リンク リスト データ構造の実装コード共有

小云云
リリース: 2018-02-26 15:17:08
オリジナル
1561 人が閲覧しました

データ構造は、後入れ先出し の原則に従う順序付けされたコレクションであり、皿のスタックと同様に、非常に正確です。は一番下に配置し、一番上のものは一番下に配置する必要があります。リリースされたばかりです。要素がスタックに追加されるとき、最初に追加される要素はスタックの一番下にあり、最後に追加される要素は一番上の要素と呼ばれます。

jsはスタックとそのメソッドを実装します

具体的な内容は

  • スタックの作成: jsではスタックに似た配列を使用します

  • スタックに要素を追加しますpush()

  • 要素を削除しますdelete()

  • スタックサイズsize()

  • スタックの最上位要素を表示peek()

  • スタックが空かどうかを確認isEmpty()

  • スタックを空にするempty()

  • Print stack print()

  • codeを使用

        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();
        }
    }
    ログイン後にコピー
  • Use
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());
ログイン後にコピー

Queue

JS スタック、キュー、リンク リスト データ構造の実装コード共有 メンポースープを飲むために列に並ぶのと同じように、誰が来ますか先頭が先頭で、後から来る人が列に並びます。 列の最後尾では、前で飲み終えた人が順番に並び替えられます。 要素は列の先頭から削除されます。要素はキューの最後から追加されます。スタックの実装に似ています

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());
ログイン後にコピー

実装の違い

JS スタック、キュー、リンク リスト データ構造の実装コード共有削除操作と最初(スタックの一番上)の要素へのアクセス方法が異なります。これは、lastの原理が異なるためです。 -in-first-out と first-in-first-out スタックは配列の最後のビット (pop()) を削除し、キューは配列の最初のビットを削除します (shift())。スタックの最上位要素は配列の最後のビットであり、キューの最初の要素は配列の最初の要素です。

この本では、ES6 の新機能を使って書かれた実装方法を使用しています。うーん、ES6 についてはよくわかりません。後で様子を見てみます~~~

追加の優先キュー

はっきり言って、この本には、優先順位が小さいものはフロントであると規定されています。それから私はそれを自分で実装しました。両方とも実行しました。優先順位はありませんが、ここにコードを掲載します。上記 2 つのメソッド (私が queue を宣言したことに注意してください。本ではそれは items ^_^)

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(&#39;aa&#39;,2);
pq.enqueue(&#39;aba&#39;,4);
pq.enqueue(&#39;jjjj&#39;,8);
pq.enqueue(&#39;aaaaaaa&#39;,8);
pq.enqueue(&#39;aa&#39;,-1);
console.log(pq.print());
ログイン後にコピー

Linked list

Linked list は順序付けられた要素のセットを格納しますが、要素である array とは異なります。リンクされたリストは連続して配置されません。各要素は、要素自体を格納するノードと、次の要素を指す参照 (ポインター) で構成されます。

単一リンク リスト

JS スタック、キュー、リンク リスト データ構造の実装コード共有

リンク リスト クラスのメソッドには、次のものが含まれます。

段落を書くためです セクションをテストするので、関数が一緒に書かれないように、最初に分けて、後でまとめます。 JS スタック、キュー、リンク リスト データ構造の実装コード共有

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(&#39;aa&#39;,2);
pq.enqueue(&#39;aba&#39;,4);
pq.enqueue(&#39;jjjj&#39;,8);
pq.enqueue(&#39;aaaaaaa&#39;,8);
pq.enqueue(&#39;aa&#39;,-1);
console.log(pq.print());
ログイン後にコピー
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()  获取链表长度
ログイン後にコピー

toString、size、indexOf メソッド

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(&#39;lorry1&#39;);
linkList.append(&#39;lorry2&#39;);
linkList.append(&#39;lorry3&#39;);
linkList.appendAt(&#39;lorry4&#39;,0);

linkList.appendAt(&#39;lorry5&#39;,0);// 那么当前链表的元素顺序是 lorry5,lorry4,lorry1,lorry2,lorry3console.log(linkList.deleteAt(2));
console.log(linkList.getHead().next);//获取头元素的下一个元素
ログイン後にコピー
rree

関連推奨事項:

PHP はスタック データ構造とブラケット マッチングを実装します

PHP は 2 つのスタックを使用してキュー関数を実装します

phpリニアテーブルのプッシュとポップの詳しい説明JS スタック、キュー、リンク リスト データ構造の実装コード共有

以上がJS スタック、キュー、リンク リスト データ構造の実装コード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート