棧是一種特殊的線性表,只能在一端進(jìn)行操作
- 往棧中添加元素的操作,一般叫做
push
,入棧 - 往棧中移除元素的操作,一般叫做
pop
,出棧(只能移除棧頂元素,也叫做:彈出棧頂元素) - 后進(jìn)先出的原則,
Last In First Out
,LIFO
棧的接口設(shè)計(jì)
用Swift
定義一個協(xié)議Stackable
,聲明幾個棧的常規(guī)操作,如果要實(shí)現(xiàn)一個棧,遵循Stackable
協(xié)議,內(nèi)部自己去實(shí)現(xiàn),一般滿足以下幾個接口既可以。
關(guān)于關(guān)聯(lián)類型associatedtype
的使用,可以看這里關(guān)聯(lián)類型 Associated Type
動態(tài)數(shù)組、鏈表都能用來實(shí)現(xiàn)棧
protocol Stackable {
associatedtype Element //關(guān)聯(lián)類型(可以理解泛型)
mutating func push(_ element: Element) //入棧
mutating func pop() -> Element //出棧
func size() -> Int //元素的數(shù)量
func top() -> Element //獲取棧頂元素
func isEmpty() -> Bool //是否為空
}
實(shí)現(xiàn)一個Stack
類,遵循Stackable
協(xié)議
這里因?yàn)榫幾g器會自動處理,其實(shí)可以不用寫明typealias Element = Int
,只要實(shí)現(xiàn)協(xié)議方法的時候?qū)懨魇?code>Int就行,編譯器會自動關(guān)聯(lián)到需要的類型
class Stack: Stackable {
//給關(guān)聯(lián)類型設(shè)置真實(shí)類型
typealias Element = Int
var elements = [Int]()
func size() -> Int { elements.count }
func push(_ element: Int) { elements.append(element) }
func pop() -> Int { elements.removeLast() }
func top() -> Int { elements.last! }
func isEmpty() -> Bool { elements.isEmpty }
}
var stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
stack.push(4)
let size = stack.size()
print(size) // 4
let top = stack.top()
print(top) // 4
while !stack.isEmpty() {
print(stack.pop())
}
// 4 3 2 1