相信你們都聽過一句話程序=數據結構+算法,數據結構和算法是脫離編程語言而存在的,不一樣的語言有不一樣的實現版本,但內在的邏輯卻不會有變化,所體現的編程思想不會有變化。雖然前端可能對數據結構和算法的要求沒有那麼高,可是做爲一個程序員數據結構是咱們應該掌握的基本知識。javascript
棧是一種特殊的線性表,咱們只可以在棧頂對其進行操做,有着先進後出的特色前端
實現棧能夠用數組來存儲數據,這是最簡單的方式。java
// 定義一個stack類
function Stack() {
let items = [] // 用於存儲數據,
}
複製代碼
你還能夠定義其餘你認爲你將要用到的方法,這些只是一些經常使用的方法程序員
// 添加一個元素到棧頂
this.push = (data) => {
items.push(data)
}
複製代碼
// 刪除棧頂元素
this.pop = () => {
return items.pop()
}
複製代碼
// 返回棧頂元素
this.top = () => {
return items[items.length - 1]
}
複製代碼
// 檢查棧是否爲空
this.isEmpty = () => {
return items.length === 0
}
複製代碼
// 返回棧的大小
this.size = () => {
return items.length
}
複製代碼
// 清空棧
this.clear = () => {
items = []
}
複製代碼
最終代碼算法
function Stack() {
let items = []
this.push = (data) => {
items.push(data)
}
this.pop = () => {
return items.pop()
}
this.top = () => {
return item[items.length - 1]
}
this.isEmpty = () => {
return items.length === 0
}
this.size = () => {
return items.length
}
this.clear = () => {
items = []
}
}
複製代碼
下面的字符串中包含小括號,請編寫一個函數判斷字符串中的括號是否合法,所謂合法,就是括號成對出現編程
括號存在嵌套關係,也存在並列關係,若是是用數組存儲這些括號,而後再想辦法一對一對的抵消掉,彷佛是一個可行的辦法,但是如何判斷一個左括號對應的是哪一個右括號呢?站在數組的肩膀上思考這個問題,就陷入到一種無從下手的絕望之中。數組
如今,咱們站在棧的肩膀上思考這個問題,解題的步驟就很是簡單,咱們可使用for循環遍歷字符串的每個字符,對每一個字符作以下的操做:數據結構
當for循環結束以後,若是棧是空的,就說明全部的左右括號都抵消掉了,若是棧裏還有元素,則說明缺乏右括號,字符串括號不合法。數據結構和算法
function is_leagl(str) {
let stack = new Stack()
for(let i = 0; i < str.length; i ++) {
let item = str[i]
if(item === '(') { // 左括號入棧
stack.push(item)
} else if (item === ')') { // 右括號
if(stack.isEmpty()) { // 檢查棧是否爲空
return false
} else { // 不爲空彈棧
stack.pop()
}
}
}
}
複製代碼
棧還有其餘不少的應用好比:一、計算代數式;二、構造表達式;三、用於函數得調用等等。編程語言
在學習了棧以後瞭解到了它的方便之處,雖然是基於數據來實現的,可是在某些場景使用起來比數據更加方便快捷。後面會繼續學習隊列、鏈表、樹、圖等其餘數據結構來豐富本身的知識。