严蔚敏《数据结构》——循环队列

严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针。为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdlib>两个头文件,来还原原汁原味的严奶奶版数据结构中的算法。

/*循环队列*/
//队的顺序存储结构
#include<cstdio>
#include<cstdlib>
#define QElemType int
#define Status int
#define MAXQSIZE 100//队列的最大长度

typedef struct {
	QElemType* base;//初始化动态分配空间
	int font;//头指针,若队列不为空则指向队列头元素
	int rear;//尾指针,若队列不为空,则指向队尾元素的下一个元素
}SqQueue;

初始化队列

Status InitQueue(SqQueue& Q) {
	Q.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));
	if (!Q.base) printf("内存空间初始化失败!\n"); exit(OVERFLOW);
	Q.font = Q.rear = 0;
	printf("循环队列创建成功!\n");
	return 0;
}

返回队列长度

Status QueueLength(SqQueue Q) {
	return (Q.rear - Q.font + MAXQSIZE) % MAXQSIZE; //MAXQSIZE取模的作用是将尾指针和头指针连接起来
}

插入元素e作为新的队尾元素

Status EnQueue(SqQueue& Q, QElemType e) {
	if ((Q.rear + 1) % MAXQSIZE == Q.font) printf("该队列已满!\n"); exit(OVERFLOW);
	Q.base[Q.rear] = e;//利用数组代替指针
	Q.rear = (Q.rear + 1) % MAXQSIZE;
	printf("元素%d插入成功!\n", e);
	return 0;

若队列不为空,则排除队头元素,并用e返回其值

Status DeQueue(SqQueue& Q, QElemType e) {
	if (Q.font == Q.rear) printf("这是一个空队列!\n"); exit(OVERFLOW);
	e = Q.base[Q.font];
	Q.font = (Q.font + 1) % MAXQSIZE;
	printf("已删除队头元素%d\n", e);
	return 0;
}

遍历队列

Status QueueTraverse(SqQueue Q) {
	int i;
	for (i = Q.font; i < Q.rear; i++) {
		printf("%d", Q.base[i]);
	}
	printf("遍历完成!\n");
	return 0;
}

创建新的循环队列

Status CrQueue(SqQueue& Q, int n) {
	InitQueue(Q);
	int i;
	for (i = 0; i < n; i++) {
		int e;
		scanf_s("请输入第一个元素:%d", &e);
		EnQueue(Q,e);
	}
	printf("新队列创建成功\n");
	return 0;
}

获取队头元素

Status GetHead(SqQueue Q, QElemType e) {
	if (QueueEmpty(Q)==true) printf("这是一个空队列!\n"); exit(OVERFLOW);
	e = Q.base[Q.font];
	printf("这个队列的头元素是:%d\n", e);
	return 0;
}

判断该队列是否为空

bool QueueEmpty(SqQueue Q) {
	if (Q.font == Q.rear) printf("这是一个空队列!\n"); return true;
	printf("这不是一个空队列\n"); 
	return false;
}

置空队列

Status ClearQueue(SqQueue Q) {
	Q.font == Q.rear;
	printf("这个队列置空操作成功!\n");
	return 0;
}

销毁这个队列

Status DestotyQueue(SqQueue Q) {
	free(Q.base);//销毁栈的连续空间
	Q.font = Q.rear = 0;
	printf("这个队列销毁成功!\n");
	return 0;
}
int main() {
	/*此处省略10000字*/
}

 main交给各位写了,我实现了没有问题的,有问题的请联系我。

学艺不精,若有错误还请多多指教,谢谢。

p.s.在使用Visual Studio编译器的时候输入scanf()方法要用scanf_s()

更多内容请移步公众号 手撕算法。谢谢

算法爱好者协会群:940100543,加入学习讨论。

所使用编译器为:Visual Studio2019 链接:https://pan.baidu.com/s/1eg8CNrqrP1jn7GRzHfYXxA
                                                                    提取码:1234

推荐新手使用dev cpp                        链接:https://pan.baidu.com/s       /1XZp_8lVE7X6tMLmvXRbYhw
                                                                     提取码:1234

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爷傲|奈我何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值