- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
10.7 抽象数据类型
Stock 类非常具体。然而,程序员常常通过定义类来表示更通用的概念。例如,就实现计算机专家们所说的抽象数据类型(abstract data type,ADT)而言,使用类是一种非常好的方式。顾名思义,ADT 以通用的方式描述数据类型,而没有引入语言或实现细节。例如,通过使用栈,可以以这样的方式存储数据,即总是从堆顶添加或删除数据。例如,C++程序使用栈来管理自动变量。当新的自动变量被生成后,它们被添加到堆顶;消亡时,从栈中删除它们。
下面简要地介绍一下栈的特征。首先,栈存储了多个数据项(该特征使得栈成为一个容器——一种更为通用的抽象);其次,栈由可对它执行的操作来描述。
- 可创建空栈。
- 可将数据项添加到堆顶(压入)。
- 可从栈顶删除数据项(弹出)。
- 可查看栈否填满。
- 可查看栈是否为空。
可以将上述描述转换为一个类声明,其中公有成员函数提供了表示栈操作的接口,而私有数据成员负责存储栈数据。类概念非常适合于 ADT 方法。
私有部分必须表明数据存储的方式。例如,可以使用常规数组、动态分配数组或更高级的数据结构(如链表)。然而,公有接口应隐藏数据表示,而以通用的术语来表达,如创建栈、压入等。程序清单 10.10 演示了一种方法,它假设系统实现了 bool 类型。如果您使用的系统没有实现,可以使用 int、0 和 1 代替 bool、false 和 true。
程序清单 10.10 stack.h
在程序清单 10.10 所示的示例中,私有部分表明,栈是使用数组实现的;而公有部分隐藏了这一点。因此,可以使用动态数组来代替数组,而不会改变类的接口。这意味着修改栈的实现后,不需要重新编写使用栈的程序,而只需重新编译栈代码,并将其与已有的程序代码链接起来即可。
接口是冗余的,因为 pop( ) 和 push( ) 返回有关栈状态的信息(满或空),而不是 void 类型。在如何处理超出栈限制或者清空栈方面,这为程序员提供了两种选择。他可以在修改栈前使用 isempty( ) 和 isfull( ) 来查看,也可以使用 push( ) 和 pop( ) 的返回值来确定操作是否成功。
这个类不是根据特定的类型来定义栈,而是根据通用的 Item 类型来描述。在这个例子中,头文件使用 typedef 用 Item 代替 unsigned long。如果需要 double 栈或结构类型的栈,则只需修改 typedef 语句,而类声明和方法定义保持不变。类模板(参见第 14 章)提供了功能更强大的方法,来将存储的数据类型与类设计隔离开来。
接下来需要实现类方法,程序清单 10.11 提供了一种可行的实现。
程序清单 10.11 stack.cpp
默认构造函数确保所有栈被创建时都为空。pop( ) 和 push( ) 的代码确保栈顶被正确地处理。这种保证措施是 OOP 更可靠的原因之一。假设要创建一个独立数组来表示栈,创建一个独立变量来表示栈顶索引。则每次创建新栈时,都必须确保代码是正确的。没有私有数据提供的保护,则很可能由于无意修改了数据而导致程序出现非常严重的故障。
下面来测试该栈。程序清单 10.12 模拟了售货员的行为——使用栈的后进先出方式,从购物筐的最上面开始处理购物订单。
程序清单 10.12 stacker.cpp
程序清单 10.12 中的 while 循环删除输入行中剩余部分,就现在而言这并非是必不可少的,但它使程序的修改更方便(第 14 章将对这个程序进行修改)。下面是该程序的运行情况:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论