表、栈、队列

作为三种最基本的数据结构,掌握它们必不可少。本次介绍的重点如下:

  • 介绍抽象数据类型ADT)的概念
  • 阐述如何有效地执行对的操作
  • 介绍ADT及其在实现递归方面的应用
  • 介绍队列ADT及其在操作系统和算法设计中的应用

1.1 抽象数据类型(Abstract Data Type)

ADT是带有一组操作的一些对象的集合,就想我们所知的insert、add、remove等数据操作。抽象数据类型是数学的抽象,这点也体现出数学的魅力之大。
可以类比整数、实数和布尔数各自都有与之相关的操作,而抽象数据类型也是如此,只不过数据类型更加复杂一些。
现有操作汇总:add/remove/size/contains/union/find
对于union(并)和find(查找),在这两种操作又在这个集合上定义了另一种不同的ADT
此外,三种基本的数据结构可以以多种方式进行实现

对于每种ADT并不存在什么法则来告诉我们必须要有哪些操作,这是一个设计决策。

3.2 表ADT

list)形如A0,A1,A2,…,AN-1,这个list的大小为N,我们将大小为0的特殊的表称为空表(empty list)。
对于除了空表外的任何表,我们说Ai后继Ai-1(或继Ai-1之后,i<N)并称Ai-1前驱Ai(i>0)。
表中的第一个元素为A0,最后一个元素为AN-1。我们不定义A0的前驱元,也不定义AN-1的后继元。Ai在表中的位置为i。
对list ADT的相关操作,printListmakeEmpty是常用的操作。find是返回某一项首次出现的位置;insertremove一般是从表的某个位置插入和删除某个元素,参数为位置及被操作数的值;而findKth是返回(作为参数指定的)某个位置上的元素。

3.2.1 表的简单数组实现

对于数组的本身结构来看(比作电影院固定的座位),其需要一段连续的内存空间存储数据,并且空间大小固定,这样很有可能面临值泄露的问题;按索引查找速度快,但是插入删除操作慢;其次就是索引值是否为正整数的问题。

3.2.2 简单链表(Linked list)

为了避免插入或删除带来的额外的开销,此时必须保证表可以不连续存储,否则的话一个的变化会引起整体的移动。
双向、单向)链表的插入删除

3.3 STL中的vector和list

STL: Standard Template Librart 标准模板库
类似于list ADT的数据结构被称为集合collection)或容器container)。
vector提供表ADT的一种可增长的数组实现;list则提供表ADT的双向链表实现。
vectorlist两者均为类模板,它们用其所存储的项的类型来实例化而成为具体的类。
下面这三种方法实际上对所有的STL容器都是可用的:
int sie() const; //返回容器中元素的个数
void clear(); //从容器中删除所有元素
bool empty() const; //若容器不含有元素则返回true,否则返回false
记忆:看规模大小,清空,再检查是否为空。
vector与list两者都支持以常数时间访问表的前端项,操作如下:
void push_back(const Object & x); //把x添加到表的尾端
void pop_back(); //删除位于表的尾端的对象
const Object & back() const; //返回位于表的尾端处的对象(还提供一个返回引用的修改函数)
const Object & front() const; //返回位于表的前端处的对象(还提供一个返回引用的修改函数)
因为双向链表在其前端可以进行高效的改动,而vector却不能,故下列两种方法只对list是可用的:
void push_front(const Object & x); //把x添加到表的前端
void pop_front(); //删除位于表的前端的对象
vector有它自己的方法集,这些方法list不具备。有两种方法可以进行高效的索引操作,而其余的两种方法允许程序员查看和改变内部容量,这些方法是:
Object & operator[] (int idx); //返回vector中下标为idx的对象,不带界限检验(还提供一个返回常量引用的访问函数)。
Object & at(int idx); //返回vector中下标为idx的对象,带有边界检验(还提供一个返回常量引用的访问函数)。
int capacity() const; //返回vector的内部容量
void reserve(int newCapacity); //设置新的容量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑字。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值