我们在上节博客中说到,在 SeqList 下又可以衍生出 StaticList 和 DynamicList 两个子类。那么我们今天就来看看这两个子类,它们是如何实现的以及它们之间有何区别。 A、StaticList 的设计要点:首先必须是一个类模板。其次是使用原生数组作为顺序存储空间,最后是使用模板参数决定数组大小。 B、DynamicList 类的设计要点:它也必须得是一个类模板。申请连续堆空间作为顺序存储空间;动态设置顺序存储空间的大小;保证重置顺序存储空间时的异常安全性。
我们说到线性表,可能好多人还不太理解。那么我们举个例子来说,在幼儿园中,老师们总会让小朋友以同样的派对秩序出行,这个例子的本质就是线性表。 那么线性表(List)的表现形式是怎样的呢?符合以下几个特征:1、零个或多个数据元素组成的集合;2、数据元素在位置上是有序排列的;3、数据元素的个数是有限的;4、数据元素的类型必须是相同的。那么线性表的抽象定义是怎么定义的呢?线性表是具有相同类型的 n( ≥ 0 ) 个数据元素的有限序列。
在当代的软件架构实践中,我们有三条准则:1、尽量使用单重继承的方式进行系统设计;2、尽量保持系统中只存在单一的继承树;3、尽量使用组合关系代替继承关系。但是由于 C++ 语言的灵活性使得代码中可以存在多个继承树,C++ 编译器的差异使得同样的代码可能表现不同的行为。我们想下,new 操作如果失败将会发生什么呢?那么肯定会导致异常嘛,这时我们便用到了前面构建的异常类,此时我们只需抛出一个内存不足的异常,便会得到一个提示。我们这时便有必要来创建一个顶层的父类了,那么创建它的意义在哪呢?一是遵循经典设计准则,所有的数据结构都继承自 Object 类,二是定义动态内存申请的行为,提高代码的移植性。
我们在之前学习了 C++ 中有关异常的知识,现在我们来重新回顾下。那么异常的格式是什么呢?便是 try ... catch ...;try 语句处理正常的代码逻辑,而 catch 语句则处理异常情况,try 语句中的异常由对应的 catch 语句处理。 在 C++ 中,通过 throw 语句抛出异常信息。throw 抛出的异常必须被 catch 处理,当前函数如果能处理异常,程序将继续往下执行;如果当前函数无法处理异常则函数停止执行并返回。未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。 同一个 try 语句可以跟上多个 catch 语句。catch 语句可以定义具体处理的异常类型,不同类型的异常由不同的 catch 语句负责处理;try 语句中可以抛出任何类型的异常,catch(...) 用于处理所有类型的异常,任何异常都只能被捕获(catch)一次
我们看到这个标题是不是觉得有点纳闷?我们要学习的是数据结构和,并不是某门语言。比如 C++ 就支持泛型编程,那么我们为什么还要来讨论这个呢?我们先来看看数据结构的特点:1、专注于数据元素之间的关系;2、专注于特定结构之上的算法。数据结构并不关注数据元素的具体类型!那么如何为数据结构的学习选择合适的语言呢?我们之前有见到过 C 语言版的数据结构,也有 C++ 版的数据结构。但是从耦合性的角度来看,支持泛型编程的语言最适合数据结构的学习。所谓泛型编程便指的是不考虑具体数据类型的编程方式。
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。我们将会在本系列的博客种利用数据结构的知识打造一个可复用的模板库,基础语言是 C++。
今天我们来看下算法复杂度和效率的问题,在判断一个算法的效率时,操作数量中的常数项和其他次要项常常是可以忽略的,只需要关注最高阶项就能得出结论。那么我们如何用符号定性的判断算法的效率呢?算法的复杂度分为两部分:1、时间复杂度,即算法运行后对时间需求量的定性描述;2、空间复杂度,即算法运行后对空间需求量的定性描述。 数据结构重点关注的是算法的效率问题,因此,我们后面会集中于讨论算法的时间复杂度;但其使用的方法完全可以用于空间复杂度的判断!我们经常在进行算法的时间复杂度用大O表示法来进行分析。下来对此种方法进行说明,算法效率严重依赖于操作(Operation)数量;操作数量的估算可以作为时间复杂度的估算;在判断时首先关注操作数量的最高次项。
我们今天来学习下数据结构,那么为什么要学习数据结构呢?学习它的意义可以使我们培养专业的程序设计思维,训练使用程序语言描述解决方案的能力。它是算法分析专业课的先修课程,也就是说,如果我们以后想学习算法类的课程,我们就必须得学好数据结构。我们先来看看程序的本质,程序是为了解决实际问题而存在的,从本质上而言,程序是解决问题的步骤描述。我们在进行问题分析时,首先得确认问题类型,如数值计算,求最小值个数等;其次是确认求解步骤,如打开文件,读数据,关闭文件,计算和等。那么我们如何判断问题求解步骤的好坏呢?1、用尽量少的时间解决问题;2、用尽量少的步骤解决问题;3、用尽量少的内存解决问题。数据结构主要的研究范围是:1、非数值计算类型的程序问题;2、数据间的组织和操作方式;3、数据的逻辑结构和存储结构。我们经常会听到:程序 = 数据结构 + 算法。那么对于数据结构和算法的研究而言,语言不重要,重要的是思想。但是它们是有前提的,我们绝对不能忽视它们的前提条件。
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号