数据结构之栈-> Swift版本

作者: 大兵布莱恩特 | 来源:发表于2017-03-12 18:24 被阅读96次

    iOS 开发中用到的 UINavigationController 其实就是一个栈结构,可以存放多个子控制器,栈顶控制器为当前显示的控制器,栈底控制器为 rootViewController ,当 push 操作时会将一个新的 UIViewController 存放到栈中去, pop 操作时会将栈顶控制器从 UINavigationController中移除

    Github代码地址 : https://github.com/ZhaoBingDong/DataStructure.git

    今天用 swift 代码来实现一个栈结构,使其具备一下特点
    1 能够插入一个新的元素到栈中
    2 能够从栈顶取出一个元素
    3 能够清空栈中的所有元素
    4 能够遍历栈中所有元素
    5 当栈为空或者满的时候不进行插入和取出的任何操作.

    Simulator Screen Shot 2017年3月13日 下午1.39.51.png

    一 如何创建这个栈 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 界面的栈操作示意图

    Untitled.gif

    逻辑代码如下 :

        // 清空栈操作
        @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)
            
        }
    
    
    

    相关文章

      网友评论

        本文标题:数据结构之栈-> Swift版本

        本文链接:https://www.haomeiwen.com/subject/qxcxnttx.html