《数据结构》队列的顺序表示--循环队列

前端之家收集整理的这篇文章主要介绍了《数据结构》队列的顺序表示--循环队列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
/*
队列的线性表示--循环队列 
*/ 
#include<stdio.h>
#define MAXQSIZE 100

/*
定义顺序队列 
*/
typedef struct{
	int *base;//分配存储空间 
	int front;//队头指针 
	int rear;//队尾指针 
}SqQueue;

//初始化循环队列 
/*
算法思想:
循环队列的初始化就是动态分配一个预定义大小的数组空间,base指向数组的基地址,
队头指针和队尾指针都置为0,表是队列为空。 
*/
int InitQueue(SqQueue &Q){
	Q.base=new int[MAXQSIZE];//分配存储空间
	if(!Q.base) return 0;//存储空间分配失败 
	Q.front=Q.rear=0;
	return 1;
}

/*
求队列的长度 
算法思想:
循环队列的长度的计算方法是:尾指针和头指针的差值再加上MAXSIZE然后和MAXQSIZE取模 
*/
int QueueLength(SqQueue Q){
	return ((Q.rear-Q.front)+MAXQSIZE)%MAXQSIZE;
}

/*
入队操作:将元素e入队Q 
算法思想: 1.首先判断队列是否已满,若满,则返回;
			2.若队列不满,将e入队,队尾指针加1 
*/
int EnQueue(SqQueue &Q,int e){
	//首先判断队列是否已满
	if((Q.rear+1)%MAXQSIZE==Q.front){
		return 0;
	} 
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXQSIZE;
	return 1;
}

/*
出队操作:
 思想:
 1.首先判断队列是否为空,若空,返回0;
 2.若不为空,则将元素出队,修改对头指针。 
*/
int DeQueue(SqQueue &Q,int &e){
	if(Q.front==Q.rear){
		return 0;
	}
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return 1;
}


//遍历队列
/*
思想:1.首先获取队列的长度,使用QueueLength(Q)函数,
2.当变量i小于队列的长度时,将元素挨个出队,并打印出出队的元素。 
*/
void TraveQueue(SqQueue Q){
	int len=QueueLength(Q);
	for(int i=0;i<len;i++){
		int e;
		DeQueue(Q,e);
		printf("%d ",e);
	}
} 

int main(){
	SqQueue Q;
	
	if(InitQueue(Q)){
		printf("队列初始化成功!\n");
	}else{
		printf("队列初始化失败!\n");
	}
	
	int len;
	printf("队列的初始长度是:%d\n",QueueLength(Q));
	
	int n;
	printf("请输入队元素的个数:\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int e;
		printf("请输入第%d个元素的值:",i+1);
		scanf("%d",&e);
		EnQueue(Q,e); 
	}
	printf("遍历队列:\n");
	TraveQueue(Q);
	return 0;
}

猜你在找的数据结构相关文章