上一篇數據結構講到了棧,隊列和棧很是相似。隊列也是一種特殊的列表,它與棧的區別在於,棧是先入後出,而隊列則是遵循FIFO先入先出的原則,換言之隊列只能在隊尾插入元素,而在隊列的頭部去刪除元素。數據結構
舉個簡單的例子,隊列就至關於在生活中排隊購物,後來的人須要排在隊尾,而隊伍最前面的人會一次結帳後出列。隊列的應用很是普遍,經常使用於實現緩衝區,廣度優先搜索,優先級隊列等等。ui
隊列最主要的兩個操做分別是enqueue(入列)和dequeue(出列)this
經過上面這張圖咱們能夠看到隊列的幾個特色spa
初始化指針
class Queue { constructor(max=1000){ // 定義一塊連續的存儲空間用來存儲數據 this.data = new Array(1000); // 開闢的空間大小 this.max = max; // 頭部位置 this.head = 0; // 尾部位置 this.tail = 0; // 數據長度 this.size = 0; } }
enqueue 入列code
enqueue(x) { // 溢出 if(this.size === this.max){ throw 'overflow' } // 添加新數據到尾部 this.data[this.tail] = x; // 數據長度+1 this.size++; // 尾部指針向後挪動一位,若是後面沒有空間,則指向0 if(this.tail === this.max-1){ this.tail = 0; }else{ this.tail++ } }
dequeue出列blog
dequeue(){ if(this.size === 0){ throw 'underflow'; } const x = this.data[this.head]; this.head++; this.size--; return x; }
class Queue { constructor(max = 1000) { this.data = new Array(max); this.max = max; this.head = 0; this.tail = 0; this.size = 0; } // 入列 enqueue(x) { if (this.size === this.max) { throw 'overflow'; } this.data[this.tail] = x; this.size++; if (this.tail === this.max - 1) { this.tail = 0; } else { this.tail++; } } // 出列 dequeue() { if (this.size === 0) { throw 'underflow'; } const x = this.data[this.head]; this.head++; this.size--; return x; } get length() { return this.size; } } module.exports = Queue;
隊列也能夠經過兩個棧來實現,不瞭解棧的同窗能夠看上一篇關於棧文章,接下來會引入以前寫好的棧,具體代碼見下面。隊列
// 上一節中,棧的實現代碼 const Stack = require('./stack'); class Queue { constructor(max=1000){ // 實例化兩個棧,分別是s1和s2, s1棧用來作入列,s2棧用來出列使用 this.s1 = new Stack(max); this.s2 = new Stack(max); this.max = max; } // 入列 enqueue(x) { if(this.s1.length === this.max){ throw 'overflow' } // s1做爲入列 this.s1.push(x); } // 出列 dequeue(){ if(this.s2.length>0){ return this.s2.pop; } while(this.s1.length){ this.s2.push(this.s1.pop()); } return this.s2.pop(); } }
在這裏大體簡單的說明一下以上用兩個棧來實現隊列的邏輯吧。圖片
下一張的數據結構會爲你們介紹鏈表get