循环队列

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

关键技巧:

判断队空: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
请按任意键继续. . .

 

你可能感兴趣的:(队列)