iOS 开发中用到的 UINavigationController 其实就是一个栈结构,可以存放多个子控制器,栈顶控制器为当前显示的控制器,栈底控制器为 rootViewController ,当 push 操作时会将一个新的 UIViewController 存放到栈中去, pop 操作时会将栈顶控制器从 UINavigationController中移除
Github代码地址 : https://github.com/ZhaoBingDong/DataStructure.git
今天用 swift 代码来实现一个栈结构,使其具备一下特点
1 能够插入一个新的元素到栈中
2 能够从栈顶取出一个元素
3 能够清空栈中的所有元素
4 能够遍历栈中所有元素
5 当栈为空或者满的时候不进行插入和取出的任何操作.
一 如何创建这个栈 MyStack
init(_ capacity : Int) {
stackCapacity = capacity;
clearStacks()
}
/// 清空栈所有元素
open func clearStacks() {
self.stacks = [T]()
stacklength = 0
stackTop = 0
}
二 判断栈长度和栈是否为空,为满
// 获取栈元素个数
private var stacklength : Int = 0
/// 栈是否为空
open func stackEmpty() -> Bool {
return stacklength == 0
}
/// 栈是否为满
open func stackFull() -> Bool {
return stacklength == stackCapacity
}
三 往栈中插入一个元素.
/// 入栈一个元素
public func push(_ element : String) -> Bool {
if stackFull() {
return false
} else {
self.stacks?.insert(element, at: stackTop)
stackTop+=1;
stacklength+=1;
return true
}
}
/// 从栈顶取出一个元素
public func pop() -> T? {
if stackEmpty() {
return nil;
} else {
stackTop-=1;
stacklength-=1;
let string = self.stacks?[stackTop]
print("出栈一个元素\(String(describing: string))")
return string
}
}
四 遍历栈中元素 , 用来验证栈中插入 清空 取出元素后栈中元素的变化情况
/// 遍历栈中所有元素
open func stackTraverse() {
if stackEmpty() {
print("栈中没有元素");
return
}
for i in 0..<stackTop {
print("\n\((self.stacks?[i])!),\n")
}
}
结合代码实现了一个带 UI 界面的栈操作示意图
逻辑代码如下 :
// 清空栈操作
@IBAction func clearStacks(_ sender: UIButton) {
for view in self.contentView.subviews {
view.removeFromSuperview()
}
self.stack?.clearStacks()
}
// 出栈操作
@IBAction func pop(_ sender: UIButton) {
if (self.stack?.stackEmpty())! {
return
}
// 根据栈顶索引 取出栈顶的 label
let topLabel = self.contentView.subviews[((self.stack?.stackTop)!-1)]
topLabel.removeFromSuperview()
// 出栈一个元素
let _ = self.stack?.pop()
}
// 入栈操作
@IBAction func push(_ sender: UIButton) {
if (self.stack?.stackFull())! {
return
}
let array : [String] = ["大兵布莱恩特","张三","李四","科比","詹姆斯","杜兰特","库里"]
let index = arc4random_uniform(UInt32(array.count))
let name = array[Int(index)]
let topLabel = self.contentView.subviews.last as? UILabel
var labelY : CGFloat = 0.0
if topLabel != nil {
labelY = (topLabel?.frame.minY)!-100.0;
} else {
labelY = 300.0
}
let label = UILabel(frame: CGRect(x: 0.0, y: labelY, width: self.contentView.frame.size.width, height: 100.0))
label.textColor = UIColor.white
label.textAlignment = .center
label.text = "view\((self.stack?.stackTop)!) name = \(name)"
label.tag = (self.stack?.stackTop)!
label.backgroundColor = UIColor.RandomColor()
self.contentView.addSubview(label)
// 入栈一个元素
let _ = self.stack?.push(name)
}