当前课程知识点:数据结构(上) > 第四章 栈与队列 > (d)队列接口与实现 > 04D-3 实现
我们这里给出一种实现方法
好消息是 并不需要从轮子开始造起
与栈同理
既然队列也是属于序列
自然可以利用我们此前已经实现的
最基本的向量以及列表结构
直接派生而得
比如这里选用列表来实现队列
具体的代码如下
可以看到 所谓的Queue
也就是队列模板类
的确是以public的形式
继承自我们此前已经实现完善的list
所以因此同样地 一些标准接口
像size()或者是empty()等等
都可以直接沿用
我们不必再重写了
其实某种意义上而言
插入和删除等动态操作也是如此
只不过因为这里操作位置受限
而且名字也进行了更换
所以我们有必要重新定义一下
而且定义的方法非常的简明
我们可以看到 所谓的enqueue
其实就是将当前的元素
作为末元素插入
与其说是队列
不如说是列表当中
如果你有点淡忘了
建议你去温习一下insertAsLast这个接口
从功能上看
如果我们是通过一个列表来模拟队列的话
我们这里的习惯
将顶端认为是前端front
相应地 将底端取作尾端
那么insertAsLast就是将一个新的元素
作为最后那个元素插入其中
这种方式非常自然
我们再来看删除操作dequeue()
可以看到 这里无非是去找到
当前的首元素 first element
从位置来看 也就是这个元素
first接口将按照语义
返回这个节点的position
而当我们用这个position
交给remove接口的时候
它就会顺利地将这个节点删除掉
当然 这里我们保证了
这个队列当前是非空的
对这一点的核对
我们交给程序员来完成
既然我们的前端取作这个位置
所以首元素首当其冲的
也就是我们需要查询的那个front元素
因此我们将first node的data域
直接返回也是再自然不过了
由此可见
这种基于以前的工作
来进一步完成新的任务的思路
是非常高明的
不仅使得我们的工作可以快速推进
而且使得整个工作的系统性和安全性
都能得到保障
那么更好的消息是
我们如果稍做考察的话会发现
如此实现的
无论是enqueue dequeue还是front
这些接口都能够在常数的时间内完成
O(1)的时间
这也是不能再好的消息了
你应该还记得 我们在基于向量
以public的形式派生出来的stack模板类
对于vector的方向选择是非常敏感的
我们更倾向于使用vector的首端
作为栈结构的底端 或者说叫盲端
而所有的动态操作 包括push
以及pop 都在另一端
也就是vector的末端来进行
我们当时曾经做过分析
这样前后颠倒过来
虽然还勉强可行
但是在效率上
却会有天壤之别
那么当我们基于List
来实现Queue的时候
是否也需要注意这个禁忌呢?
如果将两个方向颠倒过来
又会如何呢?
我们将这个问题作为这一节的思考题
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验