循环队列

#include<iostream>
#include<vector>
using namespace std;
typedef int DataType;
#define MaxSize 50
typedef struct {   //循环队列的存储结构
	DataType data[MaxSize];
	int front,rear;
}SqQueue;

/*
	循环队列的注意事项
	公共的:
		队列的初始状态:Q.front=Q.rear=0
		入队操作:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%MaxSize;
		出队操作:x=Q.data[Q.front];Q.front=(Q.front+1)%MaxSize;
	1.循环队列的队列满和队列空的条件一样  所以要采取特殊方法区分
		1.牺牲一个存储单元来区分队满和队空    常用
			队满条件:(Q.rear+1)%MaxSize==Q.front
			队空条件:Q.rear==Q.front;
	2.类型中增设一个表示元素个数的数据成员
		typedef struct{
			DataType data[MaxSize];
			int front,rear;
			int size; //表示队列中数据元素个数
		}
		队满条件:Q.size==MaxSize;
		队空条件:Q.size==0;
	3.类型增设tag数据成员
		typedef struct{
			DataType data[MaxSize];
			int front,rear;
			int tag;  
		}
		队满条件:tag==1;若因插入导致Q.rear==Q.front; 那麽表示队列为满
		队空条件:tag==0;若因删除导致Q.rear==Q.front; 那麽表示队列为空
*/


//初始化循环队列
void InitQueue(SqQueue &Q){
	Q.front=Q.rear=0;
} 
//判队空
bool isEmpty(SqQueue &Q){
	if(Q.front==Q.rear){
		return true;
	}else{
		return false;
	}
} 
//入队
bool EnQueue(SqQueue &Q,DataType x){
	if((Q.rear+1)%MaxSize==Q.front)  //队满情况  用一个空间来区分队满和队空
	{
		cout<<"队列已满,无法入队!"<<endl;
		return false;
	 } 
	else{
		Q.data[Q.rear]=x;  //入队
		Q.rear=(Q.rear+1)%MaxSize;	//修改队尾指针 	
		return true;
	 }
} 
//出队
bool DeQueue(SqQueue &Q,DataType &x){
	if(Q.rear==Q.front){
		cout<<"循环队列为空,无法进行出队操作!"<<endl;
		return false;
	}
	else{
		x=Q.data[Q.front];
		Q.front=(Q.front+1)%MaxSize;
		return true;
	}
} 

int main(){
	SqQueue Q;
	InitQueue(Q);
	if(isEmpty(Q)){
		cout<<"队列为空!"<<endl;
	}else{
		cout<<"队列非空!"<<endl;
	}
	EnQueue(Q,100);
	EnQueue(Q,200);
	DataType x;
	DeQueue(Q,x);
	cout<<x<<endl;
	DeQueue(Q,x);
	cout<<x<<endl;
	if(isEmpty(Q)){
		cout<<"队列为空!"<<endl;
	}else{
		cout<<"队列非空!"<<endl;
	}
	return 0;
} 

  

posted @ 2021-02-14 21:11  nanfengnan  阅读(53)  评论(0)    收藏  举报