循环队列的初始化,入队,出队,求队长,取队头元素

1.要会判断队满:

if((Q.rear+1)%MAXQSIZZE == Q.front){//判断队满
		return ERROR;
	}

2.判断队空

if (Q.front == Q.rear) return ERROR;//判断队空

3.获取队长

j = (Q.rear - Q.front + MAXQSIZZE) % MAXQSIZZE;

4.队头后移和队尾后移要注意,移动要怎么写?(重要!)

Q.front = (Q.front + 1) % MAXQSIZZE;//让队头元素后移
Q.rear = (Q.rear + 1) % MAXQSIZZE;//取余是为了在队尾时加一可以回到头,形成循环

下面上代码:

#include<stdio.h>
#include<stdlib.h>
#define MAXQSIZZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
int i, n, e, j, x, num;
//队列看成循环队列,通过少放一个元素来解决假上溢
typedef struct {
	int* base;//指向数组名的指针,代表数组第一个元素的地址
	int front;//队头元素的下标
	int rear;//队尾元素的下标
}SqQueue;
//1.循环队列的初始化
int InitSqQueue_Q(SqQueue &Q) {
	Q.base = (int*)malloc(MAXQSIZZE * sizeof(SqQueue));//分配数组的空间
	if (!Q.base)exit(OVERFLOW);
	Q.front = Q.rear = 0;//让队列为空
	return 0;
}
//2.循环队列入队(元素e入队)
int EnQueue_Q(SqQueue &Q,int e) {
	if((Q.rear+1)%MAXQSIZZE == Q.front){//判断队满
		return ERROR;
	}
	Q.base[Q.rear] = e;//把元素e插入到队列里面的数组下标为Q.rear的位置,也就是队尾
	Q.rear = (Q.rear + 1) % MAXQSIZZE;//取余是为了在队尾时加一可以回到头,形成循环
	return OK;
}
//2.循环队列出队(出队元素用e返回)
int DeQueue_Q(SqQueue& Q,int &e) {
	if (Q.front == Q.rear) return ERROR;//判断队空
	e = Q.base[Q.front];//保存队头元素
	Q.front = (Q.front + 1) % MAXQSIZZE;//让队头元素后移
	return OK;
}
//3.获取队长
int SqQueueLength_Q(SqQueue& Q,int &j) {
	j = (Q.rear - Q.front + MAXQSIZZE) % MAXQSIZZE;
	return j;
}
//4.取队头元素
int GetHead_Q(SqQueue &Q,int &e) {
	if (Q.front == Q.rear) {
		printf("队空");
		return ERROR;
	}
	e = Q.base[Q.front];
	return OK;
}
int main() {
	SqQueue Q;
	InitSqQueue_Q(Q);
	printf("请输入初始队列元素个数:");
	scanf("%d", &n);
	printf("输入队列元素:");
	for (i = 0; i < n; i++) {
		scanf("%d", &e);
		EnQueue_Q(Q, e);
		printf("%d", e);
	}
	GetHead_Q(Q, e);
	printf("\n队头元素为:%d",e);
	printf("\n请输入出队的个数:");
	scanf("%d", &x);
	printf("出队的元素为:");
	for (i = 0; i < x; i++) {
		DeQueue_Q(Q, e);
		printf("%d", e);
	}
	SqQueueLength_Q(Q,j);
	printf("\n出队后的元素个数剩下:%d", j);
	printf("\n出队后的循环队列为:");
	for (i = 0; i < j; i++) {
		printf("%d", Q.base[Q.front]);
		Q.front = (Q.front + 1) % MAXQSIZZE;
	}
	return 0;
}

  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值