抽象类 是一个概念的概括。它是一个你发明出来只用作继承基类而不用于实例化对象的类。
抽象数据类型 (ADT) 并不一定是面向对象编程(OOP)的概念。它是一个早期术语,用于描述例如栈(Stack)和队列(Queue)的功能,而不涉及其实现细节。
“抽象数据类型”和“抽象类”是有区别的。
一个抽象类可能没有为其定义的所有方法提供具体的定义。因此,您无法直接实例化一个抽象类。您需要创建一个子类然后再实例化它。
抽象数据类型是某种数据结构的模型,例如一个栈。一个栈具有入栈(push())和出栈(pop())操作,这些操作都有明确定义的行为。
抽象数据类型(ADT)本身指的是该模型,而不是任何特定编程语言或范式中的任何具体实现。您可以在面向对象的语言中实现一个栈,但也可以在函数式编程语言中实现它。
ADTs允许讨论关于栈、队列等属性的话题,这些属性适用于ADT的所有正确实现。
在这种情况下,它本身包含ADS实体。公共接口由一些过程(以及可能的一些常量)组成。
服务器模块的接口(stack_ads.h):
#ifndef STACK_ADS
#define STACK_ADS
const int capacity = 10;
void clear();
int size();
int pop();
void push(int value);
#endif STACK_ADS
#include "stack_ads.h"
int items[capacity];
int top = -1;
void clear()
{
top = -1;
}
int size()
{
return top + 1;
}
int pop()
{
top -= 1;
return items[top + 1];
}
void push(int value)
{
top += 1;
items[top] = value;
}
#include <iostream>
#include "stack_ads.h"
int main (int argc, char* const argv[])
{
push(1);
push(2);
push(3);
std::cout << pop() << std::endl;
std::cout << pop() << std::endl;
std::cout << pop() << std::endl;
return 0;
}
在客户端模块中,我们可以声明变量为该类型。因为模块可以自由地声明多个变量为导出类型,所以它可以有多个数据结构。每个抽象数据结构都是抽象数据类型的变量。
接口(stack_adt.h):
#ifndef STACK_ADT
#define STACK_ADT
const int capacity = 10;
typedef struct
{
int items[capacity];
int top;
} StackADT;
void clear(StackADT* stack);
int size(StackADT* stack);
int pop(StackADT* stack);
void push(StackADT* stack, int value);
#endif STACK_ADT
#include "stack_adt.h"
void clear(StackADT* stack)
{
stack->top = -1;
}
int size(StackADT* stack)
{
return stack->top + 1;
}
int pop(StackADT* stack)
{
stack->top -= 1;
return stack->items[stack->top + 1];
}
void push(StackADT* stack, int value)
{
stack->top += 1;
stack->items[stack->top] = value;
}
客户端模块:
#include <iostream>
#include "stack_adt.h"
int main (int argc, char* const argv[])
{
StackADT stack1;
StackADT stack2;
stack1.top = -1;
stack2.top = -1;
push(&stack1, 1);
push(&stack1, 2);
push(&stack1, 3);
std::cout << pop(&stack1) << std::endl;
std::cout << pop(&stack1) << std::endl;
std::cout << pop(&stack1) << std::endl;
push(&stack2, 10);
push(&stack2, 20);
push(&stack2, 30);
std::cout << pop(&stack2) << std::endl;
std::cout << pop(&stack2) << std::endl;
std::cout << pop(&stack2) << std::endl;
return 0;
}
如果我们的语言支持面向对象编程(OOP),我们可以通过类来描述 ADT。在客户端模块中,我们可以声明变量为该类型。在面向对象编程术语中,这种类型称为“类”,拥有该类型的变量称为“对象”。
服务器模块接口(Stack.h):
#ifndef STACK
#define STACK
const int capacity = 10;
class Stack
{
public:
Stack();
void clear();
int size();
int pop();
void push(int value);
private:
int items[capacity];
int top;
};
#endif STACK
实现(Stack.cpp):
#include "Stack.h"
Stack::Stack()
{
this->top = -1;
}
void Stack::clear()
{
this->top = -1;
}
int Stack::size()
{
return this->top + 1;
}
int Stack::pop()
{
this->top -= 1;
return this->items[this->top + 1];
}
void Stack::push(int value)
{
this->top += 1;
this->items[this->top] = value;
}
客户端代码:
#include <iostream>
#include "stack.h"
int main (int argc, char* const argv[])
{
Stack stack1;
Stack stack2;
stack1.push(1);
stack1.push(2);
stack1.push(3);
std::cout << stack1.pop() << std::endl;
std::cout << stack1.pop() << std::endl;
std::cout << stack1.pop() << std::endl;
stack2.push(10);
stack2.push(20);
stack2.push(30);
std::cout << stack2.pop() << std::endl;
std::cout << stack2.pop() << std::endl;
std::cout << stack2.pop() << std::endl;
return 0;
}
抽象数据类型(ADT)大致而言,是一种查看数据结构的方式:关注它所做的事情,忽略它如何执行其工作。
抽象数据类型主要由其接口来定义:可以对它们执行的可允许操作。用于实现它们的底层机制通常对其用户不可见。
Stack
、Queue
和PriorityQueue
是ADT的一些示例,它们比数组、链表和许多其他数据存储结构更抽象。
例如,堆栈的底层机制可以是一个Array
或者是一个LinkedList
。 PriorityQueue
的底层机制可以是一个Array
或者称为Heap
的特殊树。
这里是使用Heap
实现的Java抽象数据类型PriorityQueue
的示例:
class Heap {
private Node heapArray[];
public void insert(Node node) {...}
public Node remove() {...}
}
class PriorityQueue {
private Heap heap;
public void insert(Node node) {
heap.insert(node);
}
public Node remove() {
return heap.remove();
}
}
PriorityQueue
类的方法只是包装在底层Heap
类的方法周围。同样,您可以使用Array
代替Heap
来实现相同的功能,即使在Array
的情况下,您需要更多的代码来处理插入和删除等操作。这个例子应该让人们从概念上清楚,PriorityQueue
是一种ADT,可以使用堆、数组等多种方式进行实现。抽象数据类型(ADT)是一种数据类型的数学模型。它描述了可在数据上执行的操作以及使用方程式定义这些操作的数学定义。
例如,您可以使用pop(),push(),top()等操作以及表示空堆栈的常量符号,完全抽象地对数字堆栈的行为进行建模。
以下是一些可能构成数字堆栈定义的方程式:
pop(empty) = empty // silently ignores popping an empty stack
pop(push(N,S)) = S // i.e. pop removes the top element of push(N,S)
top(push(N,S)) = N // return topmost element of the stack without changing the stack
抽象是编程和现实生活中最基本和最广泛的概念。
面向对象编程中的抽象数据类型是什么?
ADT是一个容器,它具有规范的不同类型对象。数据的逻辑表示(即接口或协议)以及操作以操纵数据的组成元素。
ADT的例子:列表、映射、集合、堆栈、队列、树、图。
数据结构可以实现一个或多个特定的抽象数据类型(ADT)。例如,在Java中,ArrayList、LinkedList、Stack和Vector是List的数据结构实现(类)。
现实生活中的堆栈示例:
现实生活中的队列示例:
从代码中退一步:
什么是抽象?抽象
它的要点是“不是真实的,但捕捉到真实事物的属性”
在面向对象编程中需要了解这个概念,因为你将设计对象宇宙,这需要你思考这些对象之间的关系。
抽象允许你将其中一些对象分组,从而组织:
1)你的思考过程 2)你的代码
我也一直有这个问题,但是上周解决了。
抽象类是一种通用或概括性的东西。您可以使用该类来模塑并以任何您喜欢的方式扩展它。
我可以在这里给您一个实际的例子
拿一个叫做动物的类。它包含像吃、声音、移动这样的函数,这些都是所有动物都会做的事情。您可以扩展该类来获取特定的猫、狗等。
例如。
abstract class animal {
abstract protected function eat();
abstract protected function sound();
}
class dogs extends animal
{
protected function eat() {
return "meat";
}
public function sound() {
return "bow wow";
}
}
希望我的回答对你有意义
类使用数据抽象的概念,即抽象数据类型。
抽象数据类型是一个较旧的术语,用于描述堆栈和队列的功能而不描述它们的实现方式。