数据结构C++语言描述专题系列 (一) 绪论

什么是数据结构

一些基本概念:数据、数据对象、数据元素、数据结构、数据类型、抽象数据类型

  1. 数据(data)

    是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。

  2. 数据对象(data object)

    在实际应用问题中,按数据性质归类而成的集合。

  3. 数据元素(data element)

    数据对象中成员
    整数数据对象、英文字母数据对象、学生记录• • •。

  4. 数据结构(data structure)

    由某一数据对象及该对象中所有数据元素之间的关系的有限集合。
    Data_Structure={D,R}

    数据结构有数据逻辑结构与数据物理结构之分:

    数据的逻辑结构:从解决问题的需要出发,为实现必要的功能所建立的关系,是面向问题的,属于用户的视图。
    数据的物理结构:是指数据应该如何在计算机中存放,是数据逻辑结构的物理存储方式,是面向计算机的,属于具体实现的视图。
    两者的关系:数据的物理结构是逻辑数据的存储映像。

  5. 数据类型(data type)

    一个与数据结构密切相关的概念。
    一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
    与具体程序设计语言有关。在程序设计语言中,一个变量的数据类型不仅规定了这个变量的取值范围,而且定义了它可用的操作。

  6. 抽象数据类型(ADT Abstract Data Type)

    由用户定义,用以表示应用问题的数据模型,抽象数据类型由基本数据类型组成,并包括一组相关的操作(或称服务)。
    其定义仅取决于它的一组逻辑特性,与其在计算机内表示和实现无关。

抽象数据类型的特征和优点

  • 特征:使用和实现分离,实行封装和信息隐蔽。
  • 优点:从 使用者和实现者,严格区分了抽象数据类型的两个不同的视图。
    – 从使用者的角度,只要了解该抽象数据类型的规格说明,就可以利用其公共界面中的服务来使用这个类型,不必关心其物理实现,集中精力考虑如何解决应用问题,使问题得到简化。
    – 从实现者的角度,把抽象数据类型的物理实现封装后,有利于编码、测试、也有利于将来的修改。使错误局部化,一旦出现错误,不至于影响其他模块;如果改进数据结构的物理实现,只要界面中服务的使用方式不变,所有使用该抽象数据类型的程序都可以不变,提高了系统的稳定性

ADT描述规范
ADT由头(ADT名称组成)、对数据类型的描述及操作列表三部分组成。

  ADT  ADT名称       is
      Data
           描述数据的结构
      Operations
           构造函数
               Initial values:          用来初始化对象的数据
               Process:                  初始化对象
            操作1
               Input:                       用户输入的数值
               Preconditions:         系统执行本操作前数据所必须的状态
               Process:                   对数据进行的动作
              Output:                     返回给用户的数据
               Postconditions:        系统执行操作后数据的状态
             操作2
                       • • • • • • 
             操作n
                       • • • • • • 
    end ADT ADT名称 

一个ADT的例— 整型

ADT     Integer    is
  Data
     Signed whole number N
  Operations
     设U和V为整型表达式,N为整型变量
     赋值(Assignment)
        =        N =U      将表达式U的值赋给变量N
     二目算术运算(Binary Arithmetic Operators)
         +       U +V       两个整数值相加
         Integer Addition
             Input:                  two integer values u and v
             Preconditions:    none
             Process:              add U and V using integer addition
             Output:               return the sum of U and V
             Postconditions:  none
           • • • • • • 
   end     ADT   Integer

C++描述抽象数据类型

用类(Class)类型表示
私有部分(private) :数据和内部操作
公共部分(public):用户使用类的界面
例:圆的类声明和实现
类声明

Class    Circle
{
   private:
         float  radius;    //定义数据成员radius为浮点数
   public:
         Circle(float r);     //构造函数
         float  Circumference(void)  const;    //计算圆的周长和面积
         float  Area(void)  const;                    //的函数,用户使用
 };

类的实现
//构造函数用类初始化数据成员radius

Circle::Circle(float  r):  radius(r)
{   }

//计算圆的周长

float  Circle:: Circumference(void)  const
{
   return 2×PI × radius;
}

//计算圆的面积

Float Circle:: Area(void)  const
{
    return  PI × radius × radius;
}

数据结构的内容

数据结构与其他学科的关系

这里写图片描述

数据结构内容

这里写图片描述

如何学习数据结构

以逻辑结构为主。结合各种算法

以堆栈结构为例
在汇编语言中进栈指令格式为

  push  src

执行的操作如下:

 (sp) – 2 →(sp)
 (src) →((sp)+1,(sp))

出栈指令格式为

pop  des

执行的操作如下:

((sp)+1,(sp)) → (des) 
(sp) + 2 →(sp)

在VC中有关堆栈的通过标准模板库使用

主要参考书目

  1. 数据结构( C++语言描述)
    Data Structures WITH C++
    William Ford & William Topp
    清华大学出版社
  2. 数据结构与算法——面向对象的C++设计模式
    Data Structures and Algorithms with Object-Oriented
    Design Patterns in C++
    Bruno R. Preiss 胡广斌等译
    电子工业出版社
  3. 数据结构与算法——C++版(第二版)
    Data Structures and Algorithms in C++ Second Edition
    Adam Drozdak 陈曙晖译
    清华大学出版社
  4. 数据结构 严蔚敏等 清华大学出版社
  5. 数据结构 殷人昆等 清华大学出版社

关于C++编程

关于本书中的一些约定

类的方法是公共的(Methods of a class are public)
类的函数是私有的(Functions of a class are private)
一些重要的内容都用方框、阴影背景、边注释予以强化突出。
例如:编程原则(Programming Precept)、构造函数(Constructor)等等一般用方框;
定理、引理等等一般用阴影背景将其突出出现;
某些段落的主题或要点采用加以斜体的边注释说明。

以下就一些重要的 Programming Precept 加以说明:

  • 编程原则之一: 配以精确的先决条件(precondition)和事后结果(postcondition);

  • 编程原则之二:取个好名字。Always name your classes,variables and functions with the greatest care, and explain them thoroughly.

  • 编程原则之三:Keep your documentation concise and descriptive.
    这是一件麻烦、最不乐意做的工作;同时文档的写法风格各异,有8条指导意见供参考。
    在进行问题分析、分解子问题时要全面考虑,避免一叶障目,不见森林。(Don’t lose sight of the forest for its trees)
  • 编程原则之四:Each function should do only one task, but do it well.
  • 编程原则之五:Each class or function should hide something.
  • 编程原则之六:Keep your connections simple. Avoid global variables whenever possible.
  • 编程原则之七:Never cause side effects if you can avoid it.
    If you must use global variables as input, document them thoroughly.
  • 编程原则之八:Keep ypur input and output as separate functions, so they can be changed easily and can be custom tailored to your computing system.
  • 编程原则之九:The quality of test data is more important than its quantity.
    建议四种数据:easy values、typical realistic values、extreme values and illegal values
  • 编程原则之十:Design the user interface with the greatest care possible. A program’s success depends greatly on its attractiveness and ease of use.
  • 编程原则之十 一:Keep your algorithms as simle as you can.
    When in doubt,choose the simple way.

持续更新中。。。

数据结构C++语言描述专题系列 (一) 绪论
数据结构C++语言描述专题系列 (二) 栈
数据结构C++语言描述专题系列 (三) 队列
数据结构C++语言描述专题系列 (四) 链式栈和队列
数据结构C++语言描述专题系列 (五) 递归
数据结构C++语言描述专题系列 (六) 表与串
数据结构C++语言描述专题系列 (七) 查找
数据结构C++语言描述专题系列 (八) 排序
数据结构C++语言描述专题系列 (九) 表与信息检索
数据结构C++语言描述专题系列 (十) 二叉树
数据结构C++语言描述专题系列 (十一) 多路数
数据结构C++语言描述专题系列 (十二) 集合及其表示
数据结构C++语言描述专题系列 (十三) 图
数据结构C++语言描述专题系列 (十四) 波兰表达式

目 录 译者序 前言 第一部分 预备知识 第1章 C++程序设计 1 1.1 引言 1 1.2 函数与参数 2 1.2.1 传值参数 2 1.2.2 模板函数 3 1.2.3 引用参数 3 1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2 使用不同的描述方法 18 1.4.3 操作符重载 20 1.4.4 引发异常 22 1.4.5 友元和保护类成员 23 1.4.6 增加#ifndef, #define和#endif语句 24 1.5 测试与调试 24 1.5.1 什么是测试 24 1.5.2 设计测试数据 26 1.5.3 调试 28 1.6 参考及推荐读物 29 第2章 程序性能 30 2.1 引言 30 2.2 空间复杂性 31 2.2.1 空间复杂性的组成 31 2.2.2 举例 35 2.3 时间复杂性 37 2.3.1 时间复杂性的组成 37 2.3.2 操作计数 37 2.3.3 执行步数 44 2.4 渐进符号(O、 健?、 o) 55 2.4.1 大写O符号 56 2.4.2 椒?58 2.4.3 符号 59 2.4.4 小写o符号 60 2.4.5 特性 60 2.4.6 复杂性分析举例 61 2.5 实际复杂性 66 2.6 性能测量 68 2.6.1 选择实例的大小 69 2.6.2 设计测试数据 69 2.6.3 进行实验 69 2.7 参考及推荐读物 74 第二部分 数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类ChainNode 和Chain 86 3.4.2 操作 88 3.4.3 扩充类Chain 91 3.4.4 链表遍历器类 92 3.4.5 循环链表 93 3.4.6 与公式化描述方法的比较 94 3.4.7 双向链表 95 3.4.8 小结 96 3.5 间接寻址 99 3.5.1 基本概念 99 3.5.2 操作 100 3.6 模拟指针 102 3.6.1 SimSpace的操作 103 3.6.2 采用模拟指针的链表 106 3.7 描述方法的比较 110 3.8 应用 111 3.8.1 箱子排序 111 3.8.2 基数排序 116 3.8.3 等价类 117 3.8.4 凸包 122 3.9 参考及推荐读物 127 第4章 数组和矩阵 128 4.1 数组 128 4.1.1 抽象数据类型 128 4.1.2 C++数组 129 4.1.3 行主映射和列主映射 129 4.1.4 类Array1D 131 4.1.5 类Array2D 133 4.2 矩阵 137 4.2.1 定义和操作 137 4.2.2 类Matrix 138 4.3 特殊矩阵 141 4.3.1 定义和应用 141 4.3.2 对角矩阵 143 4.3.3 三对角矩阵 144 4.3.4 三角矩阵 145 4.3.5 对称矩阵 146 4.4 稀疏矩阵 149 4.4.1 基本概念 149 4.4.2 数组描述 149 4.4.3 链表描述 154 第5章 堆栈 161 5.1 抽象数据类型 161 5.2 派生类和继承 162 5.3 公式化描述 163 5.3.1 Stack的效率 164 5.3.2 自定义Stack 164 5.4 链表描述 166 5.5 应用 169 5.5.1 括号匹配 169 5.5.2 汉诺塔 170 5.5.3 火车车厢重排 172 5.5.4 开关盒布线 176 5.5.5 离线等价类问题 178 5.5.6 迷宫老鼠 180 5.6 参考及推荐读物 188 第6章 队列 189 6.1 抽象数据类型 189 6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值