为有牺牲多壮志,敢教日月换新天。

[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 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(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.popLast()
 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 }

 

posted @ 2018-10-26 10:53  为敢技术  阅读(284)  评论(0编辑  收藏  举报