2021-09-10

数据结构学习(C语言)-循环队列

为什么要用循环队列?

先看下面的图

在这里插入图片描述

我们可以发现,不论我们是进行进队操作还是出队操作,用于标记位置的两个参数front(队首)和rear(队尾的下一个位置)在图中都是上移的。这也就意味着经过不断的出队操作,标记front下面的已申请空间越来越多,而且始终不会再次得到利用,从而造成空间的浪费。

但是如果我们使用循环队列就可以很好地解决这一问题。

在这里插入图片描述

循环队列基本操作的实例

代码如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct QUEUE {
	int * pBase;//用于指向申请数组第一个字节地址
	int front;
	int rear;
}Queue,* pQueue;
//函数声明
void initQueue(pQueue pQ);//初始化
bool isEmpty(pQueue);//队是否为空
bool isFull(pQueue);//队是否已满
void intoQueue(pQueue, int);//进队
void outQueue(pQueue, int *);//出队
void traverse(pQueue);//遍历
void clearQueue(pQueue);//清空
int main(void) {
	Queue Q;
	int pval;
	initQueue(&Q);//初始化
	intoQueue(&Q, 1);//进队
	intoQueue(&Q, 2);
	intoQueue(&Q, 3);
	intoQueue(&Q, 4);
	intoQueue(&Q, 5);
	traverse(&Q);//遍历
	outQueue(&Q,&pval);//出队
	traverse(&Q);//遍历(出队验证)
	clearQueue(&Q);//清空队列
	if (isEmpty(&Q)) {//清空结果验证
		printf_s("队已清空!\n");
	}
	return 0;
}
void initQueue(pQueue pQ){//初始化
	pQ->pBase = (int *)malloc(sizeof(int)*6);//初始化申请6个空间
	if (pQ->pBase == NULL) {
		printf_s("动态分配空间失败!\n");
		exit(-1);
	}
	else {
		pQ->front = 0;
		pQ->rear = 0;
	}
	return;
}
bool isEmpty(pQueue pQ){//对是否空
	if (pQ->front == pQ->rear)
		return true;
	else
		return false;
}
bool isFull(pQueue pQ){//队是否已满
	if ((pQ->rear + 1) % 6 == pQ->front)
		return true;
	else
		return false;
}
void intoQueue(pQueue pQ, int val){//进队
	if (isFull(pQ)) {
		printf_s("队已满,不能再进队操作!\n");
		exit(-1);
	}
	else {
		pQ->pBase[pQ->rear] = val;
		pQ->rear = (pQ->rear + 1) % 6;//rear后移,相当于队尾追加元素(即入队)
	}
	return;
}
void outQueue(pQueue pQ, int * pval){//出队
	if (isEmpty(pQ)) {
		printf_s("队为空,无法出队!\n");
		exit(-1);
	}
	else {
		*pval = pQ->pBase[pQ->front];
		pQ->front = (pQ->front + 1) % 6;//front后移,相当于删除队首元素(即出队)
		printf_s("队首元素:%d  已出队!\n",*pval);
	}
	return;
}
void traverse(pQueue pQ){//遍历
	int  p = pQ->front;
	printf_s("循环队列中元素如下:\n");
	while (p != pQ->rear) {
		printf_s("%d	", pQ->pBase[p]);
		p = (p + 1) % 6;
	}
	printf_s("\n");
}
void clearQueue(pQueue pQ) {//清空
	while (pQ->front != pQ->rear) {
		pQ->front = (pQ->front + 1) % 6;
	}
}

运行结果展示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Evekkan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值