队列 - 使用front和count表示循环数组队列(C++)

问题描述:如果用一个循环数组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