什么是数据结构
一些基本概念:数据、数据对象、数据元素、数据结构、数据类型、抽象数据类型
数据(data)
是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。
数据对象(data object)
在实际应用问题中,按数据性质归类而成的集合。
数据元素(data element)
数据对象中成员
整数数据对象、英文字母数据对象、学生记录• • •。数据结构(data structure)
由某一数据对象及该对象中所有数据元素之间的关系的有限集合。
Data_Structure={D,R}数据结构有数据逻辑结构与数据物理结构之分:
数据的逻辑结构:从解决问题的需要出发,为实现必要的功能所建立的关系,是面向问题的,属于用户的视图。
数据的物理结构:是指数据应该如何在计算机中存放,是数据逻辑结构的物理存储方式,是面向计算机的,属于具体实现的视图。
两者的关系:数据的物理结构是逻辑数据的存储映像。数据类型(data type)
一个与数据结构密切相关的概念。
一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
与具体程序设计语言有关。在程序设计语言中,一个变量的数据类型不仅规定了这个变量的取值范围,而且定义了它可用的操作。抽象数据类型(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中有关堆栈的通过标准模板库使用
主要参考书目
- 数据结构( C++语言描述)
Data Structures WITH C++
William Ford & William Topp
清华大学出版社 - 数据结构与算法——面向对象的C++设计模式
Data Structures and Algorithms with Object-Oriented
Design Patterns in C++
Bruno R. Preiss 胡广斌等译
电子工业出版社 - 数据结构与算法——C++版(第二版)
Data Structures and Algorithms in C++ Second Edition
Adam Drozdak 陈曙晖译
清华大学出版社 - 数据结构 严蔚敏等 清华大学出版社
- 数据结构 殷人昆等 清华大学出版社
关于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++语言描述专题系列 (十四) 波兰表达式