棧是一種聽從先進後出(Last In First Out )原則的有序集合。新添加的元素保存在棧頂,越早添加的元素越接近棧底。刪除元素只能從棧頂刪除。javascript
class StackArray {
constructor() {
this.items = [];
}
}
複製代碼
這即是一個基於數組建立的棧,而後咱們要爲它聲明一些方法。java
一、添加元素算法
push(element) {
this.items.push(element);
}
複製代碼
二、刪除元素編程
pop() {
return this.items.pop();
}
複製代碼
三、查看棧頂元素數組
peek() {
return this.items[this.items.length - 1];
}
複製代碼
四、檢查棧是否爲空瀏覽器
isEmpty() {
return this.items.length === 0;
}
複製代碼
五、清空棧元素數據結構
clear() {
this.items = [];
}
複製代碼
這是我舉慄建立的幾個簡單方法,接下來讓我使用這個Stack類編程語言
const stack = new StackArray();
console.log(stack.isEmpty()) // 此時輸出爲true
stack.push(5); // [] ==>[5]
stack.push(8); // [5] ==>[5,8]
console.log(stack.peek()); // 輸出爲8
stack.push(11); // [5,8] ==>[5,8,11]
console.log(stack.isEmpty()) // 這時的輸出爲false
stack.pop(); // [5,8,11] ==>[5,8]
複製代碼
class Stack{
constructor(){
this.count=0;
this.items = {};
}
}
複製代碼
這就是一個基於對象的棧,由於對象沒有length屬性,咱們要使用一個count屬性來記錄棧的大小。下面是對象棧的一些簡單的方法。學習
一、添加元素ui
push(element) {
this.items[this.count] = element;
this.count++;
}
複製代碼
二、檢查棧是否爲空
isEmpty() {
return this.count === 0;
複製代碼
三、刪除元素
pop() {
if (this.isEmpty()) { // 判斷是否爲空
return undefined;
}
this.count--; // 棧的大小減1
const result = this.items[this.count]; // 保存棧頂值
delete this.items[this.count]; // 刪除棧頂值
return result; // 返回刪除值
}
複製代碼
四、建立toString方法
toString() {
if (this.isEmpty()) {
return '';
}
let objString = `${this.items[0]}`;
for (let i = 1; i < this.count; i++) {
objString = `${objString},${this.items[i]}`;
}
return objString;
}
複製代碼
除了toString方法,咱們建立其它對象棧方法的複雜度均爲O(1),表明咱們能夠直接找到目標元素並對其進行操做(push、pop)
複製代碼
const stack = new Stack()
console.log(Object.keys(stack)); // ['count','items']
console.log(stack.items); // 能夠直接訪問這個類的內部屬性
複製代碼
咱們能夠經過Object.keys方法來直接獲取這個對象上的全部屬性,而後咱們就能對暴露出來的屬性賦新的值。這是不容許的!接下來咱們來看如何使用Javascript來實現私有屬性的方法。
一、下劃線命名約定
class Stack {
constructor() {
this._count = ();
this._items = {};
}
}
複製代碼
二、用ES6的WeakMap實現類
const items = new WeakMap(); // 聲明一個WeakMap類型的變量items
class Stack {
constructor () {
items.set(this,[]); // 在constructor中,以this爲鍵,把表明棧的數組存入items
}
push(element){
const s = items.get(this); // 從WeakMap中取出值,即以this爲鍵從items中取值
s.push(element);
}
pop(){
const s = items.get(this);
const r = s.pop();
return r;
}
}
複製代碼