zoukankan      html  css  js  c++  java
  • [Swift]堆栈Stack的两种版本:(1)用类包装Stack (2)用泛型包装Stack

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ 
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9855087.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。

    类版本堆栈

      1 class Stack
      2 {
      3     //给类添加一个Any类型的数组属性
      4     //Any可以表示任何类型,包括函数类型、可选类型
      5     var stack: [Any]
      6     
      7     //属性:获取堆栈的大小
      8     var count: Int
      9     {
     10         get {
     11             return stack.count
     12         } 
     13     }
     14     
     15     // 计算属性:返回堆栈的存储容量,数组会自动扩大为原来两倍
     16     // - get:获取堆栈的存储空间,但不会分配新的存储空间
     17     // - set:分配足够的空间来存储指定数量的元素
     18     var capacity: Int {
     19         get {
     20             return stack.capacity
     21         }
     22         set {
     23             stack.reserveCapacity(newValue)
     24         }
     25     }
     26     
     27     //初始化方法用来对数组属性初始化
     28     //如果定义了默认值,则可以在调用函数时省略该参数
     29     init()
     30     {
     31         stack = [Any]()
     32     }
     33     
     34     //通过既定数组构造堆栈
     35     init(_ arr:[Any]){
     36         stack = arr
     37     }
     38     
     39     // 如果定义了默认值,则可以在调用函数时省略该参数
     40     init(_ elements: Any...) {
     41         stack = elements
     42     }
     43     
     44     //判断堆栈是否为空
     45     func isEmpty() -> Bool
     46     {
     47         return stack.isEmpty
     48     }
     49     
     50     //检查堆栈是否已满
     51     //如果堆栈已满,则返回true,否则返回false
     52     public func isFull() -> Bool {
     53         return count == stack.capacity
     54     }
     55     
     56     //清空堆栈
     57     func clear()
     58     {
     59         stack.removeAll()
     60     }
     61     
     62     //入堆栈(一次可入队一个或多个元素)
     63     //可变参数参数接受具有指定类型的零个或更多的值
     64     func push(_ objects: Any...)
     65     {
     66         for obj in objects {
     67             stack.append(obj)
     68         } 
     69     }
     70     
     71     //出堆栈
     72     func pop() -> Any?
     73     {
     74         //判断堆栈是否为空
     75         if isEmpty()
     76         {
     77             return nil
     78         }
     79         else
     80         {
     81             //数组中移除第一个元素
     82             return stack.removeLast()
     83         }
     84     } 
     85     
     86     //获取最后堆栈第一个元素
     87     func getLast() -> Any?
     88     {
     89         //判断堆栈是否为空
     90         if isEmpty()
     91         {
     92             return nil
     93         }
     94         else
     95         {
     96             //获取堆栈第一个元素
     97             return stack.last!
     98         }
     99     }
    100     
    101      // 在打印堆栈及其元素时,输出简洁的格式
    102     var description: String {
    103         get {
    104             return stack.description
    105         }
    106     }
    107     
    108     // 打印时输出简洁漂亮的格式,主要用于调试
    109     var debugDescription: String {
    110         get {
    111             return stack.debugDescription
    112         }
    113     }   
    114 }
    115 
    116 //初始化堆栈
    117 var stack1 = Stack()
    118 var stack2 = Stack([1,2,3])
    119 dump(stack2)
    120 /*
    121 ▿ prog.Stack #0
    122   ▿ stack: 1 element
    123     ▿ 3 elements
    124       - 1
    125       - 2
    126       - 3
    127 */
    128 var stack3 = Stack(4,5,6)
    129 dump(stack3)
    130 /*
    131 ▿ prog.Stack #0
    132   ▿ stack: 3 elements
    133     - 4
    134     - 5
    135     - 6
    136 */
    137 //入队
    138 stack1.push(1,2,3,4,5,6)   
    139 //出队
    140 stack1.pop()
    141 dump(stack1)
    142 /*
    143 ▿ prog.Stack #0
    144   ▿ stack: 5 elements
    145     - 1
    146     - 2
    147     - 3
    148     - 4
    149     - 5
    150 */
    151 stack1.clear()
    152 dump(stack1)
    153 /*
    154 ▿ prog.Stack #0
    155   - stack: 0 elements
    156 */

    泛型版本堆栈

     1 public struct Stack<T> {
     2     
     3     // 泛型数组:用于存储数据元素
     4     fileprivate var stack: [T] 
     5 
     6     // 返回堆栈中元素的个数
     7     public var count: Int {
     8         return stack.count
     9     }
    10     
    11     // 计算属性:返回堆栈的存储容量
    12     // - get:获取堆栈的存储空间,但不会分配新的存储空间
    13     // - set:分配足够的空间来存储指定数量的元素
    14     public var capacity: Int {
    15         get {
    16             return stack.capacity
    17         }
    18         set {
    19             stack.reserveCapacity(newValue)
    20         }
    21     }
    22     
    23     /// 构造函数:创建一个空的堆栈
    24     public init() {
    25         stack = [T]()
    26     }
    27     
    28     //通过既定数组构造堆栈
    29     init(_ arr:[T]){
    30         stack = arr
    31     }
    32     
    33     // 如果定义了默认值,则可以在调用函数时省略该参数
    34     init(_ elements: T...) {
    35         stack = elements
    36     }
    37     
    38     // 检查堆栈是否为空
    39     // - returns: 如果堆栈为空,则返回true,否则返回false
    40     public func isEmpty() -> Bool {
    41         return stack.isEmpty
    42     }
    43     
    44     // 检查堆栈是否已满
    45     // -returns: 如果堆栈已满,则返回true,否则返回false
    46     public func isFull() -> Bool {
    47         return count == stack.capacity
    48     }
    49     
    50     // 将堆栈重置为空状态
    51     public mutating func clear() {
    52         stack.removeAll()
    53     }
    54     
    55     // 入堆栈操作:将元素添加到堆栈的末尾
    56     public mutating func push(_ element: T) {
    57         stack.append(element)
    58     }
    59     
    60     // 出堆栈操作:删除并返回堆栈中的第一个元素
    61     public mutating func pop() -> T? {
    62         return stack.removeLast()
    63     }
    64  
    65     // 返回堆栈中的第一个元素(不删除)
    66     public func getLast() -> T? {
    67         return stack.last!
    68     }
    69     
    70      // 在打印堆栈及其元素时,输出简洁的格式
    71     public var description: String {
    72         return stack.description
    73     }
    74     
    75     
    76     // 打印时输出简洁漂亮的格式,主要用于调试
    77     public var debugDescription: String {
    78         return stack.debugDescription
    79     }   
    80 }
  • 相关阅读:
    背包问题
    標準差、方差、正太分佈公式
    C#實現XML的增刪查改
    XML的基礎結構
    微信小程序入門學習資料鏈接
    微信小程序wxml無法實現頁面跳轉的問題
    088_jsp转成成servle所在的路径?
    075_jsp如何debug?
    028_Mybatis返回int类型为空时报错 attempted to return null from a method with a primitive return type (int)
    087_数据库类型
  • 原文地址:https://www.cnblogs.com/strengthen/p/9855087.html
Copyright © 2011-2022 走看看