<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
下面是一个循环队列的完整实现,欢迎读者朋友参考和指正:
template<typename t unsigned int n><br>class CyclicQueue {<br>public:<br> typedef T value_type;<br> typedef size_t size_type;<br> typedef T& reference;<br> typedef const T& const_reference;</typename>
CyclicQueue() : m_popPos(0), m_count(0) {
assert(N > 0);
m_beginPtr = (T*)(::operator new(sizeof(T) * N)); // 分配原始空间
}
~CyclicQueue() {
_Clear(); // this->_Clear();
::operator delete((void*)m_beginPtr);
}
CyclicQueue(const CyclicQueue<t n>& copy) : m_popPos(0), m_count(0) {<br> assert(N > 0);<br> m_beginPtr = (T*)(::operator new(sizeof(T) * N)); // 分配原始空间<br> size_t copyPos = copy.m_popPos;<br> for (size_type idx = 0; idx _Copy(idx, copy.m_beginPtr[copyPos]); // this->_Copy();<br> ++copyPos; copyPos %= N; ++m_count;<br> }<br> }</t>
CyclicQueue& operator=(const CyclicQueue<t n>& other) {<br> if (this != &other) { // 检查自赋值<br> CyclicQueue<t n> temp(other); // 调用拷贝构造函数<br> _Swap(temp); // this->_Swap();<br> }<br> return (*this);<br> }</t></t>
bool is_empty() const { return (m_count == 0); }
bool is_full() const { return (m_count == N); }
value_type front() {
assert(m_count != 0);
return (m_beginPtr[m_popPos]);
}
value_type front() const {
assert(m_count != 0);
return (m_beginPtr[m_popPos]);
}
value_type back() {
return _Back(); // this->_Back();
}
value_type back() const {
return _Back(); // this->_Back();
}
bool push(const_reference data = T()) {
if (m_count size_type pushPos = (m_popPos + m_count) % N;
_Copy(pushPos, data); // this->_Copy();
++m_count;
return true;
}
return false;
}
bool pop(reference data) {
if (m_count > 0) { // 不空!
data = m_beginPtr[m_popPos]; // operator=
_Destroy(m_popPos); // this->_Destroy();
--m_count; ++m_popPos; m_popPos %= N; // 新的pop位置
return true;
}
return false;
}
size_type size() const { return m_count; }
size_type capacity() const { return N; }
void clear() { _Clear(); } // this->_Clear();
void swap(CyclicQueue<t n>& other) {<br> _Swap(other); // this->_Swap();<br> }</t>
private:
void _Clear() {
for (; m_count > 0; --m_count) {
_Destroy(m_popPos); // this->_Destroy();
++m_popPos; m_popPos %= N;
}
m_popPos = 0;
}
void _Destroy(size_type idx) {
assert(idx T *pTemp = (m_beginPtr + idx);
pTemp->~T(); // 调用析构函数销毁元素对象
}
void _Copy(size_type idx, const_reference data) {
assert(idx T *pTemp = (m_beginPtr + idx);
new ((void*)pTemp) T(data); // 调用placement new和拷贝构造函数复制对象
}
void _Swap(CyclicQueue<t n>& other) {<br> std::swap(m_beginPtr, other.m_beginPtr);<br> std::swap(m_popPos, other.m_popPos);<br> std::swap(m_count, other.m_count);<br> }</t>
value_type _Back() const {
assert(m_count != 0);
size_type pushPos = (m_popPos + m_count) % N;
if (pushPos == 0)
return (*(m_beginPtr + N - 1));
return (m_beginPtr[pushPos - 1]);
}
value_type *m_beginPtr; // 队列存储空间起始位置
size_type m_popPos; // 下次pop位置
size_type m_count; // 有效元素个数
};
相关推荐
C++ 用数组实现一个循环队列,很经典的,大家可以看看。
根据栈和队列的抽象数据类型的定义,按要求实现一个栈或一个队列。 要求: 1、 实现一个共享栈 2、 实现一个链栈 3、 实现一个循环队列 4、 实现一个链队列
循环队列的C++实现,采用类写的,对数据结构学习者很有用哈
循环队列的基本操作和实现循环队列的基本操作和实现
java队列实现(顺序队列、链式队列、循环队列)
c语言实现的循环队列,附代码,标准实验报告
该C程序使用循环队列实现了N行杨辉三角的输出,实现简单。 使用VC进行编译即可。
C语言实现循环队列的基本运算,建立、入队、出队,简单易懂。
实现顺序栈或循环队列的存储 概要设计 1、定义循环队列的结构 2、返回循环队列的长度 3、访问循环队列元素 4、取循环队列的队头元素 5、在循环队列的队尾插入元素 ... 8、销毁一个循环队列 9、主函数
java数组实现循环队列。包括入队, 出队,输出队列。 队列先入先出。
C语言循环队列指针实现的一个例子,适合初学者研究
C语言实现循环队列
队列特性:先进先出(FIFO)——先进队列的元素先出队列。下面以一个简单的例子实现循环队列的操作。博客地址:http://blog.csdn.net/bingdianlanxin,有问题欢迎留言。
C++实现的循环队列方法,包含插入,删除,遍历。
设计一个算法,用一个栈s将-一个队列Q逆置: (1)要求采用顺序栈和循环队列来实现。 (2)要求采用链栈和链队列来实现。
循环队列的实现,自己编写的,基本上与书上一致,如果不知道怎么调用,可以下载看看
queue.h头文件:循环队列的实现,操作包括初始化队列、入队、检查是否为空、出队、检查是否为满。源.cpp:利用两个队列打印出杨辉三角。
主要实现循环队列的初始化,入队,出队,求队的长度等算法
以循环链表表示队列,只设置一个尾指针,指向队尾结点,不设置头指针。 要求具有下列接口,并写出主程序测试各个接口: ...写一算法实现从循环队列创建一个栈,使队头为栈顶,队尾为栈底,算法最后要求队列保持不变。