您的位置:首页 > 理论基础 > 数据结构算法

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

2013-12-01 20:43 375 查看
靠山山会倒,靠水水会流,靠自己永远不倒!

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

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

老鼠走迷宫的游戏,这些笔记都源自《数据结构算法与应用 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描述时,执行效率更高。书中还介绍了另一种描述方法是基于链表的描述,同堆栈的描述方法一
样的情形,具体到应用是用什么描述方法比较好,还没有理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息