数据结构第3节: 抽象数据类型

第3节:基础概念 - 抽象数据类型(ADT)

抽象数据类型(ADT)是一种逻辑上的数学模型,以及定义在此数学模型上的一组操作。ADT通常隐藏了底层实现的细节,只暴露出一个可以被外界访问和操作的接口。在Java中,ADT可以通过接口(interface)来定义,并通过类(class)来实现。

2.3.1 抽象数据类型的定义

ADT定义了数据的逻辑结构和操作,但不涉及数据的具体表示和实现。例如,一个栈的ADT可以定义为具有pushpoppeekisEmpty等操作。

2.3.2 Java中的ADT实现

在Java中,可以使用接口来定义ADT,然后通过类来实现这些接口。

定义一个ADT接口
public interface StackADT<T> {void push(T element);  // 入栈操作T pop();               // 出栈操作T peek();              // 查看栈顶元素boolean isEmpty();     // 检查栈是否为空
}
实现ADT接口
public class ArrayStack<T> implements StackADT<T> {private T[] elements;private int size;private static final int DEFAULT_CAPACITY = 10;public ArrayStack() {elements = (T[]) new Object[DEFAULT_CAPACITY];size = 0;}@Overridepublic void push(T element) {ensureCapacity();elements[size++] = element;}@Overridepublic T pop() {if (isEmpty()) {throw new NoSuchElementException("Stack is empty");}return elements[--size];}@Overridepublic T peek() {if (isEmpty()) {throw new NoSuchElementException("Stack is empty");}return elements[size - 1];}@Overridepublic boolean isEmpty() {return size == 0;}private void ensureCapacity() {if (size == elements.length) {T[] newElements = (T[]) new Object[elements.length * 2];System.arraycopy(elements, 0, newElements, 0, size);elements = newElements;}}
}

2.3.3 ADT的优势

  • 封装性:ADT隐藏了数据的具体实现,只暴露操作接口,提高了代码的安全性和易用性。
  • 抽象性:ADT提供了一个高层次的操作集合,使得用户可以不必关心数据的具体存储方式。
  • 通用性:ADT的实现可以针对不同的数据存储需求进行定制,但对外提供的接口保持一致。

2.3.4 使用ADT

使用ADT可以简化编程,提高代码的可读性和可维护性。用户只需要知道如何使用ADT提供的操作,而不需要了解其内部实现。

public class Main {public static void main(String[] args) {StackADT<Integer> stack = new ArrayStack<>();stack.push(1);stack.push(2);System.out.println(stack.peek());    // 输出 2System.out.println(stack.pop());     // 输出 2System.out.println(stack.isEmpty()); // 输出 false}
}

通过上述Java源码,我们可以看到ADT如何在Java中被定义和实现。定义一个接口作为ADT,然后通过不同的类来实现这个接口,可以提供多种数据结构的实现,同时保持对外的接口一致。这种方式使得代码更加模块化,易于理解和使用。

继续探讨抽象数据类型(ADT)的概念,我们可以再通过Java代码来展示另一个常见的ADT:队列(Queue)。

2.3.5 队列(Queue)ADT

队列是一种先进先出(FIFO)的数据结构,其ADT定义通常包括以下操作:

  • enqueue(T element): 在队列末尾添加一个元素。
  • dequeue(): 移除并返回队列头部的元素。
  • peek(): 返回队列头部的元素但不移除它。
  • isEmpty(): 检查队列是否为空。
定义队列的ADT接口
public interface QueueADT<T> {void enqueue(T element);  // 入队操作T dequeue();              // 出队操作T peek();                 // 查看队首元素boolean isEmpty();        // 检查队列是否为空
}
实现队列的ADT接口

我们可以利用链表来实现队列,以避免在数组实现中可能需要的昂贵的元素移动操作。

public class LinkedListQueue<T> implements QueueADT<T> {private Node<T> head; // 队首private Node<T> tail; // 队尾private static class Node<T> {T data;Node<T> next;Node(T data) {this.data = data;this.next = null;}}@Overridepublic void enqueue(T element) {Node<T> newNode = new Node<>(element);if (tail != null) {tail.next = newNode;} else {head = newNode;}tail = newNode;}@Overridepublic T dequeue() {if (isEmpty()) {throw new NoSuchElementException("Queue is empty");}T element = head.data;head = head.next;if (head == null) {tail = null;}return element;}@Overridepublic T peek() {if (isEmpty()) {throw new NoSuchElementException("Queue is empty");}return head.data;}@Overridepublic boolean isEmpty() {return head == null;}
}

2.3.6 使用队列ADT

使用队列ADT可以简化代码,使得队列操作更加直观和安全。

public class Main {public static void main(String[] args) {QueueADT<Integer> queue = new LinkedListQueue<>();queue.enqueue(1);queue.enqueue(2);System.out.println(queue.peek());    // 输出 1System.out.println(queue.dequeue()); // 输出 1System.out.println(queue.isEmpty()); // 输出 false}
}

2.3.7 ADT的进一步讨论

ADT不仅定义了数据的操作,还提供了一种思考问题的方式,使得程序员可以专注于如何使用数据,而不是如何实现数据结构。这种抽象层次上的分离是面向对象编程的核心概念之一。

通过这些案例,我们可以看到ADT在Java中的实现方式,以及它们如何帮助我们以一种抽象和通用的方式来处理数据结构。这些实现展示了ADT的封装性、抽象性和通用性的优势,同时也说明了为什么学习和使用ADT对于任何希望编写高效、可维护代码的程序员来说都是非常重要的。

让我们继续探讨抽象数据类型(ADT)的概念,并通过Java代码来展示另一个常见的ADT:链表(LinkedList)。

2.3.8 链表(LinkedList)ADT

链表是一种线性数据结构,其中元素以节点的形式存在,每个节点包含数据部分和指向下一个节点的链接。

定义链表的ADT接口
public interface LinkedListADT<T> {void addFirst(T element);  // 在链表头部添加元素void addLast(T element);   // 在链表尾部添加元素T removeFirst();           // 移除并返回链表头部的元素T removeLast();            // 移除并返回链表尾部的元素T getFirst();              // 获取链表头部的元素T getLast();               // 获取链表尾部的元素boolean isEmpty();         // 检查链表是否为空int size();                // 返回链表中的元素数量
}
实现链表的ADT接口
public class SinglyLinkedList<T> implements LinkedListADT<T> {private Node<T> head; // 链表的头节点private int size;     // 链表的元素数量private static class Node<T> {T data;Node<T> next;Node(T data) {this.data = data;this.next = null;}}@Overridepublic void addFirst(T element) {Node<T> newNode = new Node<>(element);newNode.next = head;head = newNode;size++;}@Overridepublic void addLast(T element) {Node<T> newNode = new Node<>(element);if (head == null) {head = newNode;} else {Node<T> current = head;while (current.next != null) {current = current.next;}current.next = newNode;}size++;}@Overridepublic T removeFirst() {if (isEmpty()) {throw new NoSuchElementException("Linked list is empty");}T element = head.data;head = head.next;size--;return element;}@Overridepublic T removeLast() {if (isEmpty()) {throw new NoSuchElementException("Linked list is empty");}if (head.next == null) {T element = head.data;head = null;size--;return element;} else {Node<T> current = head;while (current.next.next != null) {current = current.next;}T element = current.next.data;current.next = null;size--;return element;}}@Overridepublic T getFirst() {if (isEmpty()) {throw new NoSuchElementException("Linked list is empty");}return head.data;}@Overridepublic T getLast() {if (isEmpty()) {throw new NoSuchElementException("Linked list is empty");}Node<T> current = head;while (current.next != null) {current = current.next;}return current.data;}@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic int size() {return size;}
}

2.3.9 使用链表ADT

使用链表ADT可以简化链表操作,使得链表的使用更加直观和安全。

public class Main {public static void main(String[] args) {LinkedListADT<Integer> linkedList = new SinglyLinkedList<>();linkedList.addFirst(10);linkedList.addLast(20);System.out.println(linkedList.getFirst());  // 输出 10System.out.println(linkedList.getLast());   // 输出 20System.out.println(linkedList.removeFirst()); // 输出 10System.out.println(linkedList.removeLast());  // 输出 20System.out.println(linkedList.isEmpty());     // 输出 true}
}

通过上述Java源码,我们可以看到链表ADT如何在Java中被定义和实现。定义一个接口作为ADT,然后通过类来实现这个接口,可以提供多种链表的实现,同时保持对外的接口一致。这种方式使得代码更加模块化,易于理解和使用。

ADT的使用提高了代码的可维护性和可扩展性,因为具体的实现可以被替换或修改,而不影响使用这些数据结构的客户端代码。这种抽象层次上的分离是面向对象编程的核心概念之一,有助于创建清晰、可重用和易于测试的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql使用group_concat拼接

关键字说明 GROUP_CONCAT 是一个在关系型数据库中常见的函数&#xff0c;用于将查询结果中的多行数据合并成一行&#xff0c;并以特定的分隔符分隔每个值。它通常与 GROUP BY 结合使用&#xff0c;用于聚合数据并将每个组内的值连接起来 示例说明 假设有一个表 students 包含…

pytorch、pytorch_lightning、torchmetrics版本对应

目录 1.pytorch_lightning对应版本安装 2.PyTorch Lightning介绍 PyTorch Lightning 的作用&#xff1a; PyTorch Lightning 的基本用法&#xff1a; 报错&#xff1a;ModuleNotFoundError: No module named pytorch_lightning 这种报错一看就是缺了pytorch_lightning包&am…

2021RoboCom世界机器人开发者大赛-本科组(初赛)

1、懂的都懂 由于本题数据范围很小&#xff0c;所以直接四层for循环枚举预处理所有可能的四个数的和&#xff0c;然后对于新图中每个数的四倍&#xff0c;判断是否出现过即可 C代码&#xff1a; #include<iostream> using namespace std; const int N55; int a[N]; bo…

Linux防火墙使用(firewalld与iptables)

防火墙概述 防火墙是一种由硬件和软件组合而成&#xff0c;在内部网和外部网之间、专有网和公共网之间构造的保护屏障&#xff0c;用以保护用户资料和信息安全的一种技术 防火墙作用在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题&#xff0c;从而实现…

VUE3初学入门-02-VUE创建项目

创建VUE项目的另一个方法 三种方法通过vue-cli进行创建通过npm进行创建比较 部署到nginx修改配置生成部署文件 三种方法 上一篇是在VSCODE中建立工作区&#xff0c;然后创建&#xff0c;属于命令加鼠标方式。个人感觉&#xff0c;在VSCODE基本上都是这样的操作&#xff0c;不是…

Superset超火的企业级可视化BI分析工具

Superset&#xff0c;听起来就像是超级集合&#xff0c;确实&#xff0c;它几乎集合了所有你需要的数据功能。简单说&#xff0c;它就是一个现代化、功能强大的数据可视化工具。 它支持各种数据库&#xff0c;有着丰富的可视化选项&#xff0c;可以用来创建漂亮的数据仪表盘&a…

【PYG】GNN和全连接层(FC)分别在不同的类中,使用反向传播联合训练,实现端到端的训练过程

文章目录 基本步骤GNN和全连接层&#xff08;FC&#xff09;联合训练1. 定义GNN模型类2. 定义FC模型类3. 训练循环中的联合优化解释完整代码 GNN和全连接层&#xff08;FC&#xff09;分别使用不同的优化器和学习率分别进行参数更新解释 基本步骤 要从GNN&#xff08;图神经网…

【JavaScript脚本宇宙】从实用工具到日期处理:深度解析JavaScript库的应用与优势

提升JavaScript开发效率利器大揭秘&#xff1a;6款神奇库全面解析 前言 JavaScript已成为前端开发中不可或缺的一部分。随着项目变得越来越复杂&#xff0c;使用模块加载库可以帮助我们更好地管理和组织代码。本文将介绍几个常用的 JavaScript 模块加载库&#xff0c;包括 Re…

Sklearn 入门案例教程

Sklearn 的基本概念 1.什么是 Sklearn&#xff1f;&#xff1a;Sklearn 是一个 Python 库&#xff0c;用于机器学习和数据科学的开发。 2.Sklearn 的组件&#xff1a;Sklearn 的组件包括机器学习算法、数据预处理、模型评估等。 3.Sklearn 的应用&#xff1a;Sklearn 的应用包…

Python面试宝典第6题:有效的括号

题目 给定一个只包括 (、)、{、}、[、] 这些字符的字符串&#xff0c;判断该字符串是否有效。有效字符串需要满足以下的条件。 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相同类型的左括号。 注意&#xff1a;空字符…

Java中的异常处理与断路器模式

Java中的异常处理与断路器模式 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在软件开发过程中&#xff0c;异常处理是确保程序稳定性和可靠性的关键部分。J…

2-Protocol Buffer 基础(c++)

本教程提供了使用协议缓冲区的基本介绍。通过逐步创建一个简单的示例应用程序&#xff0c;介绍以下内容&#xff1a; 1.在.proto文件中定义消息格式。 2.使用 protocol buffer 编译器。 3.使用c protocol buffer API来写入和读取消息。 一、问题描述 将要使用的示例是…

Xilinx FPGA:vivado串口输入输出控制fifo中的数据

一、实验要求 实现同步FIFO回环测试&#xff0c;通过串口产生数据&#xff0c;写入到FIFO内部&#xff0c;当检测到按键信号到来&#xff0c;将FIFO里面的数据依次读出。 二、信号流向图 三、状态转换图 四、程序设计 &#xff08;1&#xff09;按键消抖模块 timescale 1ns…

python-django-LlamaIndex 精简版

&#x1f680; 一键安装LlamaIndex&#xff0c; pip install llama-index &#x1f4c1; 准备你的数据文件&#xff0c;无论是txt还是pdf&#xff0c;放入data文件夹&#xff0c;一切就绪。 &#x1f527; 简单几步&#xff0c;在views.py中集成LlamaIndex&#xff0c;代码如…

读书笔记-《魔鬼经济学》

这是一本非常有意思的经济学启蒙书&#xff0c;作者探讨了许多问题&#xff0c;并通过数据找到答案。 我们先来看看作者眼中的“魔鬼经济学”是什么&#xff0c;再选一个贴近我们生活的例子进行阐述。 01 魔鬼经济学 中心思想&#xff1a;假如道德代表人类对世界运转方式的期…

uniapp实现一个键盘功能

前言 因为公司需要&#xff0c;所以我.... 演示 代码 键盘组件代码 <template><view class"keyboard_container"><view class"li" v-for"(item, index) in arr" :key"index" click"changArr(item)" :sty…

初学Spring之 AOP 面向切面编程

AOP&#xff08;Aspect Oriented Programming&#xff09;面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 是面向对象&#xff08;OOP&#xff09;的延续 AOP 在 Spring 中的作用&#xff1a; 1.提供声明式事务 2.允许用户自定义切面 导…

Objects365数据集介绍

Objects365数据集介绍 什么是Objects365数据集&#xff1f;数据集的规模与内容数据集的特点数据集下载 什么是Objects365数据集&#xff1f; Objects365是一个大规模、高质量的物体检测数据集。该数据集旨在推动物体检测技术的发展&#xff0c;特别是在真实世界场景下的应用。O…

Python 学习之机器学习库(九)

Python的机器学习库种类繁多&#xff0c;每个库都有其独特的特性和应用场景。以下是一些主要的Python机器学习库&#xff0c;按照其功能和特点进行清晰归纳和分点表示&#xff1a; 1. NumPy ● 功能&#xff1a;NumPy是Python中用于科学计算的基础库&#xff0c;提供了高性能的…

【python】python当当数据分析可视化聚类支持向量机预测(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…