学习笔记-表、栈和队列

学习资料:《数据结构与算法分析 java语言描述》第三章 表、栈和队列

ADT

抽象数据类型(abstract data type,ADT)是带有一组操作的一些对象的集合。

表ADT

表的简单数据实现

对表的所有操作都可以通过数组来实现。
虽然数组是由固定容量创建的,但在需要的时候可以用双倍的容量创建一个不同的数组。

int[] arr = new int[10];
// 扩大arr
int [] newArr = new int[arr.length()*2];
for (int i = 0;i<arr.length();i++)
	newArr[i] = arr[i];
arr = newArr;
简单链表

为了避免插入和删除的线性开销,我们需要保证表可以不连续存储,否则表的每个部分都可能需要整体移动。在这里插入图片描述
链表由一系列节点组成,这些即诶单不必在内存中相连。
remove方法可以通过修改一个next引用来实现。
在这里插入图片描述
insert方法需要使用new操作符从系统获取一个新节点,此后执行两次引用的调整。
在这里插入图片描述
双链表(double linked list)
在这里插入图片描述

java Collection API中的表

表ADT是在Collections API中实现的数据结构之一

在这里插入图片描述
Collection接口扩展了Iterator接口。实现Iterator接口的那些类可以拥有增强的for循环。

Iterator接口

Iterator接口的思路:通过iterator方法,每个集合均可创建并返回给客户一个实现I儿啊投入接口的对象,并将当前位置的概念在对象内部存储下来
使用Iterator的一个重要的基本法则如果对正在被迭代的集合进行结构上的改变(即对该集合使用add、remove或clear方法),那么迭代器就不再合法(并且在其后使用该迭代器时会有ConcurrentModificationException异常抛出)。如果迭代器调用了它自己的remove方法,那么这个迭代器就仍是合法的。

List接口、ArrayList类和LinkedList类


除以AnyType作为参数的标准的remove外,remove还被重载以删除指定位置上的项。
List ADT有两种流行的实现方式。

  • ArrayList类提供了List
    ADT的一种可增长数组的实现。使用ArrayList的优点在于,对get和set的调用花费常数时间。其缺点是新项的插入和现有项的删除代价昂贵,除非变动是在ArrayList的末端进行。

  • LinkedList类则提供了List
    ADT的双链表实现。使用LinkedList的优点在于,新项的插入和现有项的删除均开销很小,缺点是它不容易作索引,因此对get的调用是昂贵的。

  • 对搜索而言,ArrayList和LinkedList都是低效的,对Collection的contains和remove两个方法(都以AnyType为参数)的调用均花费线性时间。

    在ArrayList中有一个容量的概念,它表示基础数组的大小。在需要的时候,ArrayList自动增加其容量以保证它至少具有表的大小。如果该大小的早期估计存在,那么ensureCapacity可以设置容量为一个足够大的量以避免数组容量以后的扩展。再有,trimToSize可以在索引的ArrayList添加操作完成之后使用以避免浪费空间。
    对于一个LinkedList,对该迭代器的remove方法的调用只花费常数时间,因为该迭代器位于需要被删除的节点(或在其附近)。
    对于一个ArrayList,即使迭代器位于需要被删除的节点上,其remove方法仍然是昂贵的,因为数组的项必须要移动。

关于ListIterator接口
ListIterator接口扩展了List的Iterator的功能。

在这里插入图片描述

栈ADT

栈(stack)是限制插入和删除只能在一个位置上进行的表,
该位置是表的末端,叫做栈的顶(top)。

对栈的基本操作有push(进栈)和pop(出栈),前者相当于插入,后者则是删除最后插入的元素。
栈有时又叫作LIFO(后进先出)表

栈的实现
  • 单链表(通过在表的顶端插入来实现push,通过删除表顶端的元素实现pop。top操作只是考察表顶端元素并返回它的值)
  • 数组(模仿ArrayList的add操作)
栈的应用
  • 平衡符号
  • 后缀表达式
  • 中缀到后缀的转换
  • 方法调用
平衡符号

仅就圆括号()、方括号[]和花括号{}进行检验(忽略其他字符)
简单思路:

做一个空栈。读入字符直到文件结尾
如果字符是一个开放符号,则将其入栈
如果字符是一个封闭符号,则当栈空时报错。否则将栈元素弹出。如果弹出的不是对应的开放符号,则报错。在文件结尾,如果栈空则报错。

后缀表达式

在这里插入图片描述
在这里插入图片描述

队列ADT

队列也是表

队列的基本操作是enqueue(入队),它在表的末端(叫做队尾(rear))插入一个元素,出队(dequeue),它是删除(并返回)在表的开头(叫做队头(front))的元素。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值