Swift数据结构——栈的实现

  栈(Stack)是一种后入先出(Last in First Out)的数据结构,仅限定在栈顶进行插入或者删除操作。栈结构的实际应用主要有数制转换、括号匹配、表达式求值等等。栈数据结构示意图如下所示:

这里写图片描述

一、背景知识

  从上面的示意图中,我们知道了栈是一种受限制的数据结构,它不像数组那样可以随机存取,只能在栈顶执行入栈和出栈操作,并且最先入栈的元素最后出栈,而最后入栈的元素最先出栈。那么问题来了,在Swift中,我们该如何实现一个栈数据结构呢?在回答这个问题之前,我们先来了解一点Swift的基础知识。

1、值类型和引用类型

  值类型在被赋值给另外一个实例,或者是作为参数传递给函数时,总是被复制的。也就是说它赋值或者传递的是副本,而不是原件,你修改其中一个的值,不会对另外一个值造成影响。Swift中的结构体和枚举都是值类型。

  引用类型在被赋值给另外一个实例,或者是作为参数传递给函数时,不会产生副本,而是会对底层实例创建新的引用。也就是说,它们最终都指向同一个底层实例,只要是一个引用修改了实例的值,另一个引用也会受到影响。

  Swift中没有内建的栈类型数据结构,这就意味着,如果我们要实现一个栈数据结构,就必须自定义。在Swift中,结构体和类都可以用来定义自定义类型,那么我们究竟是该用结构体还是类呢?在回答这个问题之前,先来对结构体和类的基本特性做一个简单的了解。

  在Objective-C编程中,结构体和类的区别很大,该用结构体还是类,往往一眼就能做出决定。但是,在Swift中,结构体不再像之前那么单纯,它里面增添了很多面向对象的特性,从而使得结构体可以执行一些原本只有类才能执行的任务。这样一来,貌似让结构体和类之间的选择变得困难起来。不过,结构体终究还是结构体,它永远都无法变成类。因此,对于结构体和类之间的选择,官方还是有一定的指导原则的:

(1)、如果类型需要传值,那么就用结构体。这么做会确保赋值或者传递参数到函数中时,类型是被复制的;
(2)、如果类型不支持、或者没有必要支持子类继承,那么就用结构体。结构体不支持继承关系,也就不存在子类问题;
(3)、如果类型要表达的行为相对比较直观,并且里面只包含一些简单的值,那么最好是考虑用结构体。如有必要,随时可以将其转成类;
(4)、最后一点,结构体属于值类型,而类属于引用类型。如果需要保证数据独立,不受其它影响,最好是使用结构体;
(5)、除上面4点之外的其它所有情况,均建议使用类。

  看完上面的选择建议,相信你在实现栈结构时,是该选择结构体还是类,心中一定有了明确的答案。因为栈主要是用来存储数据,不涉及继承关系,而且主要的操作就是入栈和出栈,所以最好是使用结构体。

2、认识Swift内建的数组类型

  在确定了栈使用结构体类型之后,接下来就应该为栈寻找后备存储器了。为此,先来复习一下栈数据结构的一些基本特点:①、栈可以存储多个数据元素,因此其后备存储器必须能一次存储多个独立的数据;②、另外,栈是一种后入先出的数据结构,换句话说,就是栈里面的元素在入栈和出栈时必须保持一定的顺序。Swift中已经存在的内建类型能满足上面两点的,基本上也就只有元组(Tuple)数组(Array)了。但是,元组的操作不如数组灵活,更重要的是,数组中有很多内建的属性和方法,可以极大的帮助我们简化栈结构的实现过程。为此,使用数组(Array)作为栈的后备存储器显然是最佳选择。

  在栈数据结构的实现过程中,我们已经确定了总体的方向,即采用结构体类型,并且使用数组(Array)作为后备存储器。接下来,为了更好的理解栈数据结构的实现过程,可以先了解一下数组(Array)常用的一些内建属性和方法,相关内容可以参考上一篇笔记《Swift数据结构引言》,也可以参考《The Swift Programming Language》中Collection Types的内容。

3、泛型、where和面向协议编程

  我们都知道,Swift中的常量、变量,以及函数都有自己的类型,在声明它们的时候,必须指明类型(或者通过字面量语法对其进行初始化,然后再有系统进行类型推断),而且类型一段确定,就只能存储同一类型的数据。但是很多时候,特别是函数,其具体实现过程是一模一样的,只不过处理的数据类型不同。这样一来就容易产生这样一个问题:为了尽可能多的处理各种数据类型,同一个函数要重复写很多遍,这显然不是一种聪明的做法。为了应对这个问题,Swift中引入了泛型的概念,就是在声明函数的时候,先不指明具体的数据类型,而是使用占位符,等到真正用到具体的数据时,再来确定其真实的数据类型

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值