当前位置: 首页 > 科技观察

EasyC++,抽象数据类型

时间:2023-03-11 22:21:37 科技观察

大家好,我是梁唐。抽象数据类型在我们学习数据结构的时候,经常会遇到的一个概念就是抽象数据类型(AbstractDataType),简称ADT。维基百科中的定义是:抽象数据类型是计算机科学中具有相似行为的一类特定数据结构的数学模型,或者一种或多种编程语言具有相似语义的数据类型。从这个定义来看,非常令人费解。其实我们只需要抓住核心就可以了。核心是接口和实现的分离。当我们使用一个ADT时,我们只需要和接口进行交互,而不需要关心接口中的实现细节。同样,数据也是隐藏不可见的,需要通过界面进行交互。也就是说,接口是与数据类型交互的唯一途径。此外,用户无法访问ADT的数据和实现细节。比如以栈为例,如果我们不把栈设计成ADT,那么在使用栈的时候,用户可能需要创建一个数组来存放栈中的数据,实现栈的功能通过调用一些方法。但这势必需要用户了解栈的原理和数据存储的细节。ADT会做好封装,用户只需要了解各个接口的功能,调用相应的接口就可以实现自己想要的逻辑。让我们看一下在C++Primer中实现的堆栈示例。首先我们要知道栈有哪些接口,大致有以下几种:创建一个空栈,向栈顶添加数据,从栈顶弹出数据,检查栈是否为空,检查栈是否满,然后,我们按照C++中面向对象的设计思想,封装在一个类中。首先,让我们定义这个类:#ifndefSTACK__H_#defineSTACK__H_typedefunsignedlongItem;classStack{private:enum{MAX=10};Itemititems[MAX];inttop;public:Stack();boolisempty()const;boolisfull()const;boolpush(constItem&item);boolpop(Item&item);};#endif我们看一下这个定义,会发现里面的数据设置为私有的,即用户不能直接访问数据。它只能通过公共接口进行交互,你不需要关心实现细节。它可以用作黑匣子。最后看一下C++Primer中给出的实现:#include"stack.h"Stack::Stack(){top=0;}boolStack::isempty()const{returntop==0;}boolStack::isfull()const{returntop==MAX;}boolStack::push(constItem&item){if(top0){item=items[--top];returntrue;}returnfalse;}本文转载自微信公众号「码农」,可通过以下二维码关注。转载本文请联系编码员梁公众号。