经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++抽象数据类型介绍
来源:jb51  时间:2022/1/3 14:29:35  对本文有异议

公众号:Coder梁(ID:Coder_LT)

我们在学数据结构的时候,经常遇到的一个概念就是抽象数据类型(Abstract Data Type),简称ADT。

维基百科中的定义是:抽象数据类型是计算机科学中具有类似行为的特定类别的数据结构的数学模型,或者具有类似语义的一种或多种程序设计语言的数据类型。

从这段定义来看,非常地费解,其实我们只需要抓住核心。核心就是接口和实现的分离。我们在使用一个ADT的时候,只需要和接口进行交互,而不必关心接口中的实现细节。同样,数据也是隐藏不可见的,也需要通过接口进行交互。

也就是说接口是数据类型唯一的交互方式,除此之外,用户无法接触到ADT的数据以及实现细节。

举个例子:以栈举例,如果我们不将栈设计成ADT,那么用户在使用栈的时候,可能就需要自己创建一个数组来存储栈中的数据,通过调用一些方法来实现栈的功能。但这势必需要用户了解栈的原理,以及数据存储的细节。ADT会做一个良好的封装,用户只需要了解每个接口的功能,调用对应的接口实现自己想要的逻辑即可。

我们来看一下C++ Primer当中实现的栈的例子。

首先,我们需要知道栈一共有哪些接口,大概有如下这么几个:

  • 创建空栈
  • 可添加数据到栈顶
  • 可从栈顶弹出数据
  • 可查看栈是否为空
  • 可查看栈是否已满

然后,我们遵守C++中面向对象的设计思路,将它封装在一个类当中。

首先我们来定义这个类:

  1. #ifndef STACK__H_
  2. #define STACK__H_
  3.  
  4. typedef unsigned long Item;
  5.  
  6. class Stack {
  7. ?private:
  8. ? ? ? ? enum {MAX=10};
  9. ? ? ? ? Item items[MAX];
  10. ? ? ? ? int top;
  11. ? ? public:
  12. ? ? ?Stack();
  13. ? ? ?bool isempty() const;
  14. ? ? ?bool isfull() const;
  15. ? ? ?bool push(const Item &item);
  16. ? ? ?bool pop(Item &item);
  17. };
  18. #endif

我们来看下这个定义,会发现,其中的数据都被设定成了private,也就是用户无法直接访问到数据。只能通过public的接口进行交互,也无须关心其中的实现细节,可以当做黑盒使用。

最后, 我们再来看下C++ Primer当中给出的实现:

  1. #include "stack.h"
  2.  
  3. Stack::Stack() {
  4. ? ? top = 0;
  5. }
  6.  
  7. bool Stack::isempty() const {
  8. ? ? return top == 0;
  9. }
  10.  
  11. bool Stack::isfull() const {
  12. ? ? return top == MAX;
  13. }
  14.  
  15. bool Stack::push(const Item &item) {
  16. ? ? if (top < MAX) {
  17. ? ? ? ? items[top++] = item;
  18. ? ? ? ? return true;
  19. ? ? }
  20. ? ? return false;
  21. }
  22.  
  23. bool Stack::pop(Item &item) {
  24. ? ? if (top > 0) {
  25. ? ? ? ? item = items[--top];
  26. ? ? ? ? return true;
  27. ? ? }
  28. ? ? return false;
  29. }

到此这篇关于C++抽象数据类型介绍的文章就介绍到这了,更多相关C++抽象数据类型内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号