1. 程式人生 > >簡單說一說資料結構——佇列

簡單說一說資料結構——佇列

上一次我們已經學習了棧。今天我們來說一說佇列。

佇列和棧非常類似,都是非常容易理解的資料結構。佇列是遵循先來先服務原則的一組有序的項。佇列在尾部新增新元素,並從頂部移除元素。

在現實中,最常見的佇列的例子就是排隊:
這裡寫圖片描述

排在前面的會先被服務,不管是什麼服務。概念的東西非常簡單,在這裡就不再多說了。

接下來宣告一些佇列可用的方法:
enqueue(elements):向佇列尾部新增一個或多個新的項。
dequeue():移除佇列的第一項,並返回被移除的元素。
front():返回佇列中的第一項,佇列不做任何改動。注意與dequeue的區別。
isEmpty():如果佇列中不包含任何元素,返回true,否則返回false。
size()

:返回佇列中包含的元素個數。

實現程式碼:

function Queue(){
    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.clear = function(){ items = []; } this.size = function(){ return items.length; } this.print = function(){ console.log(items.toString()); } }

佇列有兩個修改版,其一是優先佇列。元素的操作是基於優先順序的。現實中也有這樣的例子,比如機場登機的順序。頭等艙和商務艙的優先順序是要高於經濟艙的;又或者醫院總是會看病情比較嚴重的患者。

如何實現呢?設定優先順序。

function PriorityQueue(){
    var items = [];
    function QueueElement(element , priority){            //宣告一個包含元素和優先順序的建構函式
        this.element = element;
        this.priority = priority;
    }
    this.enqueue = function(element , priority){
        var queueElement = new QueueElement(element , priority);
        if(this.isEmpty()){                               //如果為空,直接入列
            items.push(queueElement);
        }else{
            var added = false;
            for(var i = 0 ; i < items.length ; i++){
                if(queueElement.priority < items[i].priority){      //插在優先順序比自己大的元素的前面
                    items.splice(i,0,queueElement);
                    added = true;
                    break;
                }
                if(!added){                                   //如果沒有優先順序比自己大的元素,直接插入隊尾
                    items.push(queueElement);
                }
            }
        }
    }
}

其二是迴圈佇列,現實生活中的例子有擊鼓傳花的遊戲。在這個遊戲中,孩子們圍成一個圓圈,把花盡快地傳遞到旁邊的人。某一時刻鼓聲停止,就停止傳遞。花在誰手上,誰就退出圓圈遊戲。直到只剩下一個孩子。實現起來也是比較簡單的:

function hotPotato(nameList , num){
    var queue = new Queue();
    for(var i = 0 ; i < nameList.length ; i++){       //把全部人加入到佇列中
        queue.enqueue(nameList[i]);
    }

    var eliminated = '';
    while(queue.size() > 1){
        for(var i = 0 ; i < num ; i++){                  //迴圈
            queue.enqueue(queue.dequeue());
        }
        eliminated = queue.dequeue();                  //到達傳遞次數,淘汰
        console.log(eliminated + '被淘汰');
    }
    return queue.dequeue();                             //最後一個勝利者
}

可以看到,不管是優先佇列還是迴圈佇列,都是基於Queue這個建構函式的。測試程式碼請移步到佇列

OK,佇列就講到這裡了。有什麼問題歡迎留言,共同討論,共同成長!

下一節聊稍微複雜的連結串列!但我還是要簡單說。

相關推薦

簡單資料結構——佇列

上一次我們已經學習了棧。今天我們來說一說佇列。 佇列和棧非常類似,都是非常容易理解的資料結構。佇列是遵循先來先服務原則的一組有序的項。佇列在尾部新增新元素,並從頂部移除元素。 在現實中,最常見的佇列的例子就是排隊: 排在前面的會先被服務,不管是什麼服務

Java實現簡單資料結構()

利用Java語言實現簡單的資料結構,Java中動態擴容的ArrayList,LinkedList,Stack,Queue以及二叉樹 1.ArrayList import java.util.Arrays; import org.junit.Test; public class A

2017浙工大院賽預賽 D 簡單資料結構【雙端佇列||陣列模擬】

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K 64bit IO Format: %lld 題目描述 慄醬有一天在網上衝浪的時候發現了一道

簡單資料結構(佇列 棧 樹 堆 )

基礎知識 基本概念 程式 = 演算法 + 資料結構 資料結構是計算機儲存、組織資料的方式。 資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。

()資料結構之線性表的簡單實現:連結串列

/* 查詢連結串列中第K個元素 */ List *FindKth( int K, List *PtrL ) { List *p = PtrL; int i = 1; while (p != NULL && i < K ) { p = p->Next; i++;

資料結構---佇列(C語言陣列實現)

https://blog.csdn.net/morixinguan/article/details/51374296 資料結構---佇列(C語言陣列實現)   佇列是先進先出的過程。簡單地畫一幅畫來描述一下佇列: 一個簡單的、由陣列實現的佇列,可以由以下幾種最基本的操

雙向連結串列簡單實現--資料結構與演算法紀錄片第一記

  從這個月開始得準備春招的東西,所以打算重新學習資料結構與演算法,以後的部落格就以這個為主。   今天是線性結構中的雙向連結串列。   程式碼實現與測試:   DoubleLinkNode:  package linear.doublelink;/** * @Description: 連結串列節點結

Java---之實現資料結構----佇列

package 資料結構;//java之實現佇列 class quene{ private class Data{ private Object obj; private Data next=null; Data(Object obj){

資料結構佇列例項

1 //資料結構 --佇列 2 //靜態佇列-用陣列實現 3 //靜態佇列通常是迴圈佇列 4 //迴圈佇列講解 5 //1.靜態佇列為什麼必須是迴圈佇列? 6 //2.迴圈佇列需要幾個引數來確定? 7 /* 8 front 和 rear 9 1)佇列初

java資料結構——佇列

  佇列是一種可以實現“先進先出”的資料結構,屬於線性表的一種。它具有如下特點: 佇列中的資料元素遵循“先進先出”的原則,簡稱FIFO結構。 在隊尾新增元素,在隊頭刪除元素。 以下連篇文章將分別介紹佇列的陣列實現、連結串列實現,雙端佇列、環形佇

Java實現簡單資料結構(五)

(5)二叉樹 public class BinaryTreeNode { private Comparable data; private BinaryTreeNode root; private BinaryTreeNode left; private BinaryTreeN

Java實現簡單資料結構(四)

(4)Queue import org.junit.Test; public class Queue { private int size = 0; private LinkedList linkedList = new LinkedList(); /** * 入隊方法

Java實現簡單資料結構(三)

(3)Stack package com.coding.basic; import org.junit.Test; public class Stack { private ArrayList elementData = new ArrayList(); /** * 壓棧

Java實現簡單資料結構(二)

2.LinkedList import java.util.NoSuchElementException; import org.junit.Test; public class LinkedList implements List { private Node first;

資料結構-佇列(2)-迴圈佇列

迴圈佇列   此前,我們提供了一種簡單但低效的佇列實現。 更有效的方法是使用迴圈佇列。 具體來說,我們可以使用固定大小的陣列和兩個指標來指示起始位置和結束位置。 目的是重用我們之前提到的被浪費的儲存。 設計迴圈佇列  

Python資料結構——佇列(queue)

先入隊的元素先出隊,即先進先出(first in first out,FIFO)。 在python中同樣可以使用列表,來構建一個佇列。 # -*- coding:utf-8 -*- # file: pyqueue.py # class PyQueue: # 建立佇

面試問題 簡單資料結構

集合結構  線性結構  樹形結構  圖形結構 集合結構 說白了就是一個集合,就是一個圓圈中有很多個元素,元素與元素之間沒有任何關係  這個很簡單   線性結構 說白了就是一個條線上站著很多個人。 這條線不一定是直的。也可以是彎的。也可

資料結構-佇列-連結串列實現

程式碼實現 //佇列 連結串列實現 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> //定義一個連結串列 typedef struct _Node Node; struct

資料結構-佇列-順序表實現-C語言

佇列定義 對於一個存取的n個內容,最先進入的最先出去(First In,First Out:FIFO),即稱為佇列. 比如,食堂排隊,最先去的,最先得到飯菜; 關鍵步驟:入隊出隊 程式碼實現 //迴圈佇列 順序表實現 #include <stdio

資料結構 - 佇列

package com.test.testQueue; public class TestQueue { private int start = 0; //對列頭初始位置 private int end = 0; //佇列尾初始位置 private int siz