学习笔记--数据结构(之二)队列

原创 2013年12月01日 20:43:00

靠山山会倒,靠水水会流,靠自己永远不倒!

        这几天没怎么学习数据结构的知识,值得反思一下,不要让自己停下来。

上次看的堆栈的几种描述方法和两个应用,一个是检测输入一段代数式中的括号的匹配和是否有效,还有一个关于

老鼠走迷宫的游戏,这些笔记都源自《数据结构算法与应用 C++版》这本书。学这些知识我觉得书可以随意的选,

选C++这版本是我把C++作为我所要实现的语言。版本经典的好像推荐严蔚敏的那本。希望通过写笔记能做到

把知识在大体的内容过一遍,还能督促自己看下去。但是提醒自己的就是看书要加入自己的一些想法和结合到应用。

考虑到队列的有效执行,这里总结有关循环队列的知识,用公式化的描述方法,公式为

 location (i ) = (location (1) + i -1) % MaxSize用来描述队列的数组被视为一个环。

                                                             

       当且仅当 front=rear 时队列为空。初始条件front=rear=0定义了一个初始为空的队列。现在需要确定队列为满的条件。如果不断地向上图的队列添加元素,直到队列满为止,那么也将看到这时有front=rear这种情形。竟然与队列为空的条件完全一样!因此,我们无法区分出队列是空还是满。为了避免这个问题,可以不允许队列被填满。为此,在队列添加一个元素之前,先判断一下本次操作是否会导致队列被填满,如果是,则报错。因此,队列的最大容量实际上是MaxSize-1。下面是公式化队列类Queue的程序。

template<class T>
class Queue {
// FIFO 对象
public:
Queue(int MaxQueueSize = 10);
~Queue() {delete [] queue;}
bool IsEmpty() const {return front == rear;}
bool IsFull() const {return (
((rear + 1) % MaxSize == front) ? 1 : 0);}
T First() const; //返回队首元素
T Last() const; // 返回队尾元素
Queue<T>& Add(const T& x);
Queue<T>& Delete(T& x);
private:
int front; //与第一个元素在反时针方向上相差一个位置
int rear; // 指向最后一个元素
int MaxSize; // 队列数组的大小
T *queue; // 数组
};

template<class T>
Queue<T>::Queue(int MaxQueueSize)
{// 创建一个容量为 MaxQueueSize的空队列
MaxSize = MaxQueueSize + 1;
queue = new T[MaxSize];
front = rear = 0;
}
template<class T>
T Queue<T>::First() const
{// 返回队列的第一个元素
// 如果队列为空,则引发异常 OutOfBounds
if (IsEmpty()) throw OutOfBounds();
return queue[(front + 1) % MaxSize];
}
template<class T>
T Queue<T>::Last() const
{// 返回队列的最后一个元素
// 如果队列为空,则引发异常 OutOfBounds
if (IsEmpty()) throw OutOfBounds();
return queue[rear];
}

template<class T>
Queue<T>& Queue<T>::Add(const T& x)
{// 把 x 添加到队列的尾部
// 如果队列满,则引发异常 NoMem
if (IsFull()) throw NoMem();
rear = (rear + 1) % MaxSize;
queue[rear] = x;
return *this;
}
template<class T>
Queue<T>& Queue<T>::Delete(T& x)
{// 删除第一个元素,并将其送入 x
// 如果队列为空,则引发异常 OutOfBounds
if (IsEmpty()) throw OutOfBounds();
front = (front + 1) % MaxSize;
x = queue[front];
return *this;
}

循环列表的有点从表中任意节点出发都能遍历整个链表。同比之下用公式location (i ) = i-1和location (i) = location (1) + i-1描述时,执行效率更高。书中还介绍了另一种描述方法是基于链表的描述,同堆栈的描述方法一

样的情形,具体到应用是用什么描述方法比较好,还没有理解。







大话数据结构读书笔记系列(六)树<上篇>

第6章 树 6.2 树的定义 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构——“树”。 树(Tree)是n(n≥0)个结点的有限集...
  • u010194538
  • u010194538
  • 2016年04月21日 20:48
  • 1371

PCIe 学习笔记(二)

pci note 2 -v0.1 2014.11.18 *** draft  本文继续pci note 1, 介绍pci_create_root_bus函数, 内核版本为3.18-rc1 ...
  • scarecrow_byr
  • scarecrow_byr
  • 2014年12月01日 22:19
  • 1716

吴恩达机器学习笔记_第二周

多元线性回归的情况: 符号表示方法,上标表示第几个样本,下标表示第几个特征。   多元线性回归的梯度下降: 当代价函数有多个参数时(即多个特征时):   使用梯度下降实用技...
  • hunterlew
  • hunterlew
  • 2016年04月11日 21:31
  • 2932

Linux邻居协议 学习笔记 之二 通用邻居处理函数对应的数据结构的分析

在linux代码中,对于不同的邻居项,抽象出了一个通用的模型,通用邻居层,主要是用来进行邻居项的创建、添加、删除、查找、更新等操作。        对于通用邻居层,最主要的就是邻居项的状态机的设计,...
  • lickylin
  • lickylin
  • 2014年03月19日 22:14
  • 1473

从零开始系列-R语言基础学习笔记之二 数据结构(一)

在上一篇中我们一起学习了R语言的环境搭建,这次我们开始学习R语言的数据结构第一部分:向量、数组和矩阵。 一、向量 向量是一维数组,其内容可以是数值、字符或布尔值,但所有数据的类型必须一致。创建向量使用...
  • bigdata_dennis
  • bigdata_dennis
  • 2017年07月20日 15:43
  • 76

学习笔记:数据结构(二)栈与队列

gan ju栈与队列实际上就是一种特殊的双链表,
  • ziyujzy
  • ziyujzy
  • 2014年05月10日 00:36
  • 322

【学习点滴-数据结构-栈&队列】 栈的应用之二:括号匹配的检测

/* *括号匹配问题描述:对于嵌套的括号形式,用栈检测是否是合法的形式。例如【()】()()就是合法的,(【()()】)也是合法的,((【)】())等是不合法的。 */ #include...
  • ohmygirl
  • ohmygirl
  • 2012年07月04日 11:03
  • 1128

数据结构之二叉搜索树和二叉平衡树学习笔记

二叉搜索树(Binary Search Tree)具有下列性质的二叉树被称为二叉搜索树:(1)、若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; (2)、若它的右子树不为空,则右子树上...
  • why850901938
  • why850901938
  • 2016年10月28日 00:03
  • 428

数据结构学习笔记之二叉树

定义:         专业定义:             1、有且只有一个称为根的节点             2、有若干个互不相交的子树,这些子树本身也是一棵树         通俗定义:   ...
  • haowei0708
  • haowei0708
  • 2015年08月23日 16:48
  • 296

python数据结构学习笔记-2016-11-05-02-优先级队列

8.3 优先级队列         8.3.1 优先级队列ADT         优先级队列:每次从队列中取出的应该是具有最高优先权的元素,这种队列称为优先级队列(priority queue)。  ...
  • baidu_21088863
  • baidu_21088863
  • 2016年11月05日 16:34
  • 234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习笔记--数据结构(之二)队列
举报原因:
原因补充:

(最多只允许输入30个字)