加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 05:58:31 所属栏目:安全 来源:网络整理
导读:/*队列的线性表示--循环队列 */ #includestdio.h#define MAXQSIZE 100/*定义顺序队列 */typedef struct{int *base;//分配存储空间 int front;//队头指针 int rear;//队尾指针 }SqQueue;//初始化循环队列 /*算法思想:循环队列的初始化就是动态分配一个预定义
/*
队列的线性表示--循环队列 
*/ 
#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("队列的初始长度是:%dn",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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读