队列 - 使用front和count表示循环数组队列(C++)
其他
2018-05-28 10:11:16
阅读次数: 0
问题描述:如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而设置计数器count用以记录队列中节点的个数。使编写算法实现队列的4个基本操作:判空、入队、出队以及输出队列中所有元素。
完整代码如下:
//C++ - 77.2 - 循环数组表示队列,只用头指针和计数变量count
/* 算法 - 实现判空、入队、出队 */
/* 队列 - 先入先出表 */
//Y_27学习笔记
#include <iostream>
using namespace std;
template <typename T>
class arrqueue
{
private:
int MaxSize,front,count; //MaxSize - 数组最大容量、front - 队列头指针、count - 当前队列中元素个数
T *qu; //T类型的数组、qu为数组名
public:
arrqueue(int size) //构造函数 - 初始化成员变量、分配内存空间的好地方
{
MaxSize = size;
qu = new T[MaxSize];
count = front = 0;
}
~arrqueue() //析构函数、动态释放动态生成的内存
{
if( qu ) //qu != NULL
{
delete [] qu; //释放qu指向的内存块
qu = NULL; //释放qu指针
}
}
bool IsEmpty() //判空
{
if( count == 0 )
{
cout << "循环队列为空" << endl;
return true;
}
else
return false;
}
bool IsFull() //判满
{
if( count == MaxSize )
{
cout << "循环队列已满" << endl;
return true;
}
else
return false;
}
bool EnQueue(const T item ); //入队操作
bool OutQueue(T &item); //出队操作
void DispQueue(); //输出队列中所有元素
};
//入队操作
template <typename T>
bool arrqueue<T>::EnQueue(const T item)
{
int rear;
if( IsFull() )
{
cout << "循环数组上溢" << endl;
return false;
}
else
{
count++; //入栈、当前元素个数加1
rear = (front+count) % MaxSize; //为实现循环数组,所以对最大容量求余
qu[rear] = item; //出栈
return true;
}
}
//出队操作
template <typename T>
bool arrqueue<T>::OutQueue(T &item)
{
if( IsEmpty() )
{
cout << "循环数组下溢" << endl;
return false;
}
else
{
front = (front+1) % MaxSize; //front指向队列中实际元素的前一个位置
item = qu[front];
count--; //出栈:注意当前元素个数减1
return true;
}
}
//输出队列中所有元素
template <typename T>
void arrqueue<T>::DispQueue()
{
cout << "下面输出队列中所有元素:";
int num = count, f = front, i;
for( i = f+1; num > 0; num-- )
{
cout << qu[i] << " ";
i = (i+1)%MaxSize; //要访问循环数组下标时、注意对其下标求余
}
cout << endl;
}
int main()
{
int num;
int item;
cout << "请输入队列最大容量" << endl;
cin >> num;
arrqueue<int> A(num); //实例化类模板、实例化T为int类型数据
//以下代码为验证出队、入队操作演示、读者可自行设计
cout << "1 - 入队" << endl;
A.EnQueue(1);
cout << "2 - 入队" << endl;
A.EnQueue(2);
cout << "3 - 入队" << endl;
A.EnQueue(3);
cout << "出队" << endl;
A.OutQueue(item);
cout << "出队元素为" << item << endl;
cout << "4 - 入队" << endl;
A.EnQueue(4);
cout << "出队" << endl;
A.OutQueue(item);
cout << "出队元素为" << item << endl;
cout << "5 - 入队" << endl;
A.EnQueue(5);
cout << "6 - 入队" << endl;
A.EnQueue(6);
A.DispQueue(); //输出队列中所有元素、注意:只是输出,不是出队
if( A.IsFull() == true )
cout << "队列已满" << endl;
return 0;
}
要点:
1.本题的front指向的是实际数组元素的第一个元素的前一个位置、而rear指向的是实际数组元素的最后一个元素的位置。
2.由于要实现循环、避免假溢出、所以数组下标i要对数组长度求余。
转载自blog.csdn.net/y_16041527/article/details/79776754