抽象数据类型(ADT)与数组、栈和队列有什么区别?
数据小陈
结论
“基础 ADT”与栈、队列之间没有客观固定的分界线。ADT 描述一组操作及其行为;“基础”通常是相对于某种编程语言或实现环境而言,指某种类型可以直接使用。
ADT 描述什么
抽象数据类型关注使用者可以进行哪些操作,以及这些操作应如何表现。使用者不需要了解数据在内部如何存储。例如,栈通常提供入栈和出栈操作,并遵循后进先出(LIFO)规则;队列通常提供入队和出队操作,并遵循先进先出(FIFO)规则。
栈的抽象接口可以简化表示为:
Stack<T>
push(item)
pop()
peek()
isEmpty()
这份接口说明了栈提供哪些操作,但没有规定底层必须使用哪种存储结构。
数组、集合、栈和队列的关系
在一些语言或运行环境中,数组是直接提供的存储结构,也可以作为底层构件。栈和队列则常作为更高层的抽象,用其他结构实现。例如,可以用数组保存栈中的元素,再用一个位置标记记录栈顶。
不过,这种分类并不固定。数组也可以通过操作和规则来描述为一种 ADT;集合通常也被定义为 ADT,包含添加、删除、查找等操作。因此,把“数组、集合”统一称为基础 ADT 未必严谨,具体要看讨论采用的定义和环境。
判断区别时看什么
可以从两个角度区分:
- 抽象层次:类型对外提供哪些操作,以及这些操作遵循什么规则。
- 实现方式:内部用什么结构保存数据,或语言、运行环境直接提供什么能力。
如果某个类型是语言内置的,或者课程把它当作现成构件,就可能称它为“基础”。这个称呼取决于上下文。栈和队列也可以成为其他程序的基础构件。更明确的区别通常在于接口、行为和实现层次。
备注:内容仅供参考。
