我是靠谱客的博主 健忘烤鸡,最近开发中收集的这篇文章主要介绍数组实现循环队列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、为了有效的处理队列,我们需要两个指针,一个用于指向队首元素所在的位置(front),一个用于指示队尾待插入的位置(rear)。

2、将数组想象成一个循环的圆形以此克服对空间的无效利用。

3、边界条件判断

由于在循环数组中,入队时队尾追赶队首,出队时队首追赶队尾,当队空或队满时都有front == rear, 故无法用此作为判定标准 


解决办法:

(1)留空位。当队列还有一个空位时就认为队列已满

(2)标记。引进一个新的变量,可以是bool型,当队尾正好在队头前面时,指示队列已满;或者用一个整形变量 来计算队列中元素的个数

(3)将一个或两个指针设置成某个不会出现的值来指示空或满状态,如当队空时将front设置成-1


下面介绍第一种方法:


队空时: front == rear



队满时:(rear + 1) % maxSize == front


代码:

enum ErrorCode

{
    success,

    underflow,

    overflow

};

const int maxQueue = 100;
 
template <class QueueEntry>
class MyQueue
{

public:

         MyQueue()
         {
         	front = rear = 0;
		 }

 

         // 判断队列是否为空
         bool empty() const
         {
         	return front == rear;
		 }

         // 入队操作
         ErrorCode append(const QueueEntry &item)
         {
         	if(full())
         		return overflow;
         	else{
					entry[rear] = item;
					rear = (rear + 1) % maxQueue;     			
				}
         		
         		return success;			 
		 }

         // 出队操作
         ErrorCode serve()
         {
         	if(empty())
         		return underflow;
         	else{
         		front = (front + 1) % maxQueue;
         			
         		return success;
			}
		 }

         // 获取队头元素
         ErrorCode retrieve(QueueEntry &item) const
         {
         	if(empty())
         		return underflow;
         	else{
         		item = entry[front];
         		return success;
			}
		 }

         // 判断队列是否已满
         bool full() const
         {
         	return (rear + 1) % maxQueue == front;
		 }

         // 获取队列已有元素个数
         int size() const
         {
         	MyQueue temp = *this;
         	
         	int count = 0;
         	
         	while(!temp.empty()){
         		temp.front = (temp.front + 1) % maxQueue;
         		
         		count++;
			}
			
			return count;
		 }

         // 清除队列所有元素

         void clear()
         {
         	while(!empty())
         		front = (front + 1) % maxQueue;
			
		 }

         // 获取队头元素并出队

         ErrorCode retrieve_and_serve(QueueEntry &item)      
         {
         	if(empty())
			 	return underflow;
			else{
				item = entry[front];
				
         		front = (front + 1) % maxQueue;
         			
         		return success;
			}  		
		 }

 

private:

         // 请不要修改数据成员.


         int front;                             // 队头下标

         int rear;                              // 队尾下标

         QueueEntry entry[100];       // 队列容器

};



最后

以上就是健忘烤鸡为你收集整理的数组实现循环队列的全部内容,希望文章能够帮你解决数组实现循环队列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部