循环队列

循环队列:解决了假溢出问题,让队列的应用更加灵活了一点。

关键技巧:

判断队空:front=rear

判断队满:(rear+1)%size=front 当队尾指针指向队头指针的前一个指针时,队列已满,所以队列中最多可存size-1个元素。

抽象数据类型表示:

//循环队列抽象数据类型
class CirQueue
{
public:
	//构造函数、析构函数
	CirQueue(int sz)
	{
		size=sz;
		front=rear=0;		//初始化为0
		data=new int[size];	//开辟这个队列存储空间
	}
	~CirQueue(){}
	//入队、出队函数
	bool EnQueue(const int x);
	int DeQueue();
	void Output();
private:
	int *data;		//队列元素指针
	int front,rear;
	int size;
};

关键算法:

/*
入队算法:
1、
*/
bool CirQueue::EnQueue(const int x)
{
	if((rear+1)%size==front)
	{
		cout<<"队列已满"<<endl;
		return false;
	}
	else
	{
		data[rear]=x;
		//技巧,处理假溢出情况
		rear=(rear+1)%size;
		return true;
	}
	
}

/*
出队算法:
1、
*/
int CirQueue::DeQueue()
{
	int x;
	if(rear==front)
	{
		cout<<"队列为空"<<endl;
		return -1;
	}
	else
	{
		x=data[front];
		front=(front+1)%size;
		return x;
	}
}


/*
输出队列算法:
1、
*/
void CirQueue::Output()
{
	int temp=front;
	while(temp!=rear)
	{
		cout<<data[temp]<<endl;
		temp=(temp+1)%size;
	}
}

主程序:

int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"--------------循环队列-----------"<<endl;
	CirQueue cq(6);		//只能存size-1个元素
	cq.EnQueue(1);
	cq.EnQueue(2);
	cq.EnQueue(3);
	cq.EnQueue(4);
	cq.EnQueue(5);
	
	cq.Output();

	cout<<"第一个出队"<<cq.DeQueue()<<endl;
	cout<<"第二个出队"<<cq.DeQueue()<<endl;
	cq.Output();
	cout<<"第三个出队"<<cq.DeQueue()<<endl;
	cout<<"第四个出队"<<cq.DeQueue()<<endl;
	cout<<"第五个出队"<<cq.DeQueue()<<endl;
	cout<<"第六个出队"<<cq.DeQueue()<<endl;
	cq.EnQueue(345);
	cq.Output();
	return 0;
}

测试结果:

--------------循环队列-----------
1
2
3
4
5
第一个出队1
第二个出队2
3
4
5
第三个出队3
第四个出队4
第五个出队5
队列为空
第六个出队-1
345
请按任意键继续. . .

 

posted @ 2013-05-25 20:57  李VS超  阅读(305)  评论(0编辑  收藏  举报