queue单向队列与栈有点类似,一个是在同一端存取数据,另一个是在一端存入数据,另一端取出数据。单向队列中的数据是先进先出(First In First Out,FIFO)。在STL中,单向队列也是以别的容器作为底部结构,再将接口改变,使之符合单向队列的特性就可以了。因此实现也是非常方便的。下面就给出单向队列的函数列表和VS2008中单向队列的源代码。单向队列一共6个常用函数(front()、back()、push()、pop()、empty()、size()),与栈的常用函数较为相似。
成员函数
(1)T& back()
返回队列最后一个元素
(2)const T& back()const
返回队列最后一个元素
(3)bool empty()const
如果队列为空,返回true,否则返回为false
(4)T& front()
返回队列第一个元素
const T& front()const
返回队列第一个元素
(5)void pop()
移去队列中的第一个元素
(6)void push(const T& el)
在队列尾部插入元素el
(7)queue()
创建一个空队列
(8)size_type size()const
返回队列中元素数目
template<class T, class container = deque<T>>
class Queue
{
public:
Queue()
{}
void Push(const T& s)
{
_con.push_back();
}
void Pop()
{
_con.pop_front();
}
size_t Size()const
{
return _con.size();
}
bool Empty()const
{
return _con.empty();
}
T& Front()
{
return _con.front();
}
T& Front()const
{
return _con.front();
}
T& Back()
{
return _con.back();
}
T& Back()const
{
return _con.back();
}
private:
container _con;
};
用list实现:
#include <iostream>
using namespace std;
#pragma once
template<class T>
struct ListNode
{
ListNode(const T& data = T())
: _prev()
, _next()
, _data(data)
{}
ListNode<T>* _prev;
ListNode<T>* _next;
T _data;
};
template<class T, class Ref, class Ptr>
class __ListIterator__
{
typedef __ListIterator__<T, T&, T*> Iterator;
typedef __ListIterator__<T, const T&, const T*> const_Iterator;
typedef __ListIterator__<T, Ref, Ptr> Self;
typedef ListNode<T>* LinkType;
typedef Ref Reference;
typedef Ptr Pointer;
public:
__ListIterator__(LinkType x = ) //构造函数
:_node(x)
{}
__ListIterator__(const Iterator& x) //拷贝构造函数
:_node(x._node)
{}
bool operator == (const Iterator& x)
{
return _node == x._node;
}
bool operator != (const Iterator& x)
{
return _node != x._node;
}
Reference operator * ()
{
return (*_node)._data;
}
Pointer operator -> ()
{
return &(operator*());
}
Self& operator ++ ()
{
_node = _node->_next;
return *this;
}
Self operator ++ (int)
{
LinkType temp = _node;
_node = _node->_next;
return temp;
}
Self& operator -- ()
{
_node = _node->_prev;
return *this;
}
Self operator -- (int)
{
LinkType temp(_node);
_node = _node->_prev;
return temp;
}
public:
LinkType _node;
};
template<class T>
class List
{
public:
typedef ListNode<T> Node;
typedef T ValueType;
typedef ValueType& Reference;
typedef const ValueType& const_Reference;
typedef ValueType* Pointer;
typedef const ValueType* const_Pointer;
typedef Node* LinkType;
typedef size_t size_type;
typedef __ListIterator__<T, T&, T*> Iterator;
typedef __ListIterator__<T, const T&, const T*> const_Iterator;
public:
List()
{
EmptyInit();
}
List(size_type n, const T& data = T()) //构造n个数值为data的节点,并连接成一个链表
{
_node = new Node(data);
LinkType NewNode = _node;
while(n--)
{
NewNode->_next = new Node(data);
NewNode->_prev = _node;
NewNode->_next->_prev = NewNode;
NewNode = NewNode->_next;
}
NewNode->_next = _node;
_node->_prev = NewNode;
}
List(const List<T>& l) //拷贝构造函数
{
EmptyInit();
Iterator it = l._node->_next;
while(it != _node)
{
PushBack(*it);
++it;
}
}
~List() //析构函数
{
if(_node != NULL)
{
cout<<"~List()"<<endl;
delete _node;
_node = NULL;
}
}
List<T>& operator = (const List<T>& l) //赋值运算符重载
{
if(this != &l)
{
Iterator temp(l._node);
Clear();
delete _node;
_node = temp._node;
}
return *this;
}
Iterator Begin() //返回首元素之后位置的迭代器指针
{
return _node->_next;
}
const_Iterator Begin()const
{
return _node->_next;
}
Iterator End() //返回尾元素之后位置的迭代器指针
{
return _node;
}
const_Iterator End()const
{
return _node;
}
bool Empty() //判断链表是否为空
{
return _node == _node->_next;
}
size_type Size()const //返回链表c中实际元素的个数
{
size_type size = ;
Iterator it(_node->_next);
while(it != _node)
{
++size;
++it;
}
return size;
}
size_type MaxSize()const //返回链表c可能容纳的最大元素数量
{
return size_type(-);
}
Reference Front() //返回首元素的引用
{
return *(Begin());
}
const_Iterator Front()const
{
return *(Begin());
}
Reference Back() // 返回尾元素的引用
{
return *(End()-);
}
const_Reference Back()const
{
return *(End()-);
}
Iterator Insert(Iterator pos, const T& x = T()) //在迭代器指针it前插入元素x,返回x迭代器指针
{
LinkType temp = new Node(x);
temp->_next = pos._node;
temp->_prev = pos._node->_prev;
pos._node->_prev = temp;
temp->_prev->_next = temp;
return temp;
}
void PushFront(const T& x) //list元素首元素前添加一个元素X
{
Insert(Begin(), x);
}
void PushBack(const T& x) //list元素尾元素添加一个元素X
{
Insert(End(), x);
}
Iterator Erase(Iterator pos) //删除迭代器指针it对应的元素
{
LinkType _nextNode = pos._node->_next;
LinkType _preNode = pos._node->_prev;
_nextNode->_prev = _preNode;
_preNode->_next = _nextNode;
delete pos._node;
return _nextNode;
}
void PopFront() //删除容器首元素,当且仅当容器不为空
{
Erase(Begin());
}
void PopBack() //删除容器尾元素,当且仅当容器不为空
{
Iterator Del = End();
Erase(--Del);
}
void ReSize(size_type newSize, const T& value = ) //从新定义链表的长度,超出原始长度部分用num代替,小于原始部分删除。
{
if(newSize < Size())
{
size_type size = Size() - newSize;
while(size--)
{
PopBack();
}
}
else
{
size_t count = newSize - Size();
while(count)
{
size_type size = Size();
Iterator temp = _node;
PushBack(value);
count--;
}
}
}
void Assign(size_type n, const T& data)
{
Iterator pTemp = _node->_next;
if(Size()>=n)
{
for(size_t idx=;idx<n; ++idx)
{
pTemp._node->_data = data;
++pTemp;
}
for(size_t idx = ; idx<Size()-n; ++idx)
{
PopBack();
}
}
else
{
pTemp = _node->_next;
size_t size = Size();
for(size_t idx=; idx<size; ++idx)
{
pTemp._node->_data = data;
++pTemp;
}
for(size_t idx = ;idx<n-size; ++idx)
{
PushBack(data);
}
}
_node = new Node(data);
LinkType NewNode = _node;
}
void Clear() //删除容器中的所有元素
{
Iterator it = Begin();
while(it != End())
{
it = Erase(it);
}
}
private:
void EmptyInit()
{
_node = new Node;
_node->_prev = _node;
_node->_next = _node;
}
public:
LinkType _node;
};
//Stack栈的模板类的实现
template<class T,class Con = Vector<T> >
class Stack
{
public:
typedef size_t SizeType;
typedef T ValueType;
public:
Stack()
{}
//判空
bool Empty()
{
return (_con.Size()==);
}
void Push(const ValueType data)
{
_con.PushBack(data);
}
void Pop()
{
_con.PopBack();
}
SizeType Size()const
{
return _con.Size();
}
ValueType& Top()
{
return _con.Back();
}
const ValueType& Top()const
{
return _con.Back();
}
private:
Con _con;
};