【数据结构】 循环队列的基本操作 (C语言版)

目录

一、顺序队列

1、顺序队列的定义:

2、顺序队列的优缺点:

二、循环队列

1、循环队列的定义:

2、循环队列的优缺点:

三、循环队列的基本操作算法(C语言)   

1、宏定义

  2、创建结构体

3、循环队列的初始化 

4、循环队列的销毁

5、循环队列的清空

6、求循环队列的长度

7、循环队列的判空

8、求队头元素

9、循环队列入队

10、循环队列出队

11、遍历队列元素

四、循环队列的基本操作完整代码(C语言)

  五、运行结果


一、顺序队列

1、顺序队列的定义:

顺序队列是由一维数组实现的队列,其中队头元素的下标为0,队尾元素的下标为n-1(n为数组大小),队列的大小在创建时确定,且在队列的生命周期内保持不变。

2、顺序队列的优缺点:

顺序队列的优点:

  1. 空间利用率高:由于数组的大小在创建时确定,因此可以预先分配足够的空间,避免了频繁的内存申请和释放操作,提高了空间利用率。
  2. 存取速度快:由于队列元素在内存中连续存储,因此可以根据下标直接访问队头元素和队尾元素,存取速度快。

顺序队列的缺点:

  1. 不适合处理动态扩展的数据:顺序队列的空间大小在创建时确定,因此无法动态扩展,对于需要处理大规模数据的情况不太适用。
  2. 容易发生假溢出:由于顺序队列的队头和队尾元素不断向后移动,当队列满时,如果继续入队操作,会导致假溢出,即无法再进行入队操作。
  3. 无法充分利用内存的连续性优势:由于顺序队列是基于数组实现的,因此无法充分利用内存的连续性优势,因为队头和队尾元素可能分散在不同的内存位置。

二、循环队列

1、循环队列的定义:

循环队列是一种线性数据结构,它将队列的元素存储在一个连续的数组中,并通过使用循环指针来管理队列的插入和删除操作。循环队列的特点在于,当队列为空时,头尾指针指向同一位置;当队列满时,头尾指针也指向同一位置。 

2、循环队列的优缺点:

循环队列的优点:

  1. 空间利用率高:循环队列使用固定大小的数组来存储元素,无需动态分配内存,因此可以充分利用存储空间。
  2. 时间复杂度稳定:在循环队列中,插入和删除操作具有固定的时间复杂度,这使得循环队列在需要频繁进行插入和删除操作的场景中表现优异。
  3. 无需额外的空间:由于循环队列使用数组实现,因此无需额外的空间来存储元素,从而降低了空间复杂度。

循环队列的缺点:

  1. 队列大小固定:循环队列的大小是固定的,因此在处理大量数据时,可能需要预先分配大量存储空间。如果实际数据量超过预分配的空间,可能会导致数据丢失或程序崩溃。
  2. 判断队列是否为空或满的判断逻辑较复杂:在循环队列中,判断队列是否为空或满的判断逻辑相对复杂。需要同时考虑头尾指针的位置和当前队列的状态。如果处理不当,可能会导致误判或错过一些特殊情况。
  3. 插入和删除操作需要移动元素:虽然循环队列在插入和删除操作时具有固定的时间复杂度,但在实际操作中,仍然需要移动元素以保持队列的连续性和循环性。如果数据量大或者数据不均匀分布,可能会影响操作效率。

三、循环队列的基本操作算法(C语言)   

1、宏定义
#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemType;
typedef int Status;
  2、创建结构体
//创建结构体
typedef struct {QElemType *base;int front;int rear;
} SqQueue;
3、循环队列的初始化 
//初始化
Status InitQueue(SqQueue &Q) {//构造一个空队列Q.base = new QElemType[MAXSIZE];if (!Q.base) {exit(OVERFLOW);}Q.front = Q.rear = 0;return OK;
}
4、循环队列的销毁
//销毁队列
Status DestroyQueue(SqQueue &Q) {if (Q.base) {delete Q.base;}Q.base = NULL;Q.front = Q.rear = 0;return OK;
}
5、循环队列的清空
//清空队列
Status ClearQueue(SqQueue &Q) {Q.front = Q.rear = 0;return OK;
}
6、求循环队列的长度
//求长度
Status QueueLength(SqQueue Q) {return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;}
7、循环队列的判空
Status QueueEmpty(SqQueue Q) {if (Q.front == Q.rear) {return true;} else {return false;}
}
8、求队头元素
//求队头元素
Status GetHead(SqQueue Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];return OK;
}
9、循环队列入队
//循环队列入队
Status EnQueue(SqQueue &Q, QElemType e) {if ((Q.rear + 1) % MAXSIZE == Q.front) return ERROR;Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXSIZE;return OK;
}
10、循环队列出队
//循环队列出队
Status DeQueue(SqQueue &Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXSIZE;return OK;
}
11、遍历队列元素
//遍历队列
void DisplayQueue(SqQueue Q) {int i = Q.front;printf("队列元素为: ");while (Q.front != Q.rear && (i + MAXSIZE) % MAXSIZE != Q.rear) {printf("%d ", Q.base[i]);i++;}
}
四、循环队列的基本操作完整代码(C语言)
#include <stdio.h>
#include <stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemType;
typedef int Status;//创建结构体
typedef struct {QElemType *base;int front;int rear;
} SqQueue;//初始化
Status InitQueue(SqQueue &Q) {//构造一个空队列Q.base = new QElemType[MAXSIZE];if (!Q.base) {exit(OVERFLOW);}Q.front = Q.rear = 0;return OK;
}//销毁队列
Status DestroyQueue(SqQueue &Q) {if (Q.base) {delete Q.base;}Q.base = NULL;Q.front = Q.rear = 0;return OK;
}//清空队列
Status ClearQueue(SqQueue &Q) {Q.front = Q.rear = 0;return OK;
}//求长度
Status QueueLength(SqQueue Q) {return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;}//判空
Status QueueEmpty(SqQueue Q) {if (Q.front == Q.rear) {return true;} else {return false;}
}//求队头元素
Status GetHead(SqQueue Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];return OK;
}//循环队列入队
Status EnQueue(SqQueue &Q, QElemType e) {if ((Q.rear + 1) % MAXSIZE == Q.front) return ERROR;Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXSIZE;return OK;
}//循环队列出队
Status DeQueue(SqQueue &Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXSIZE;return OK;
}//遍历队列
void DisplayQueue(SqQueue Q) {int i = Q.front;printf("队列元素为: ");while (Q.front != Q.rear && (i + MAXSIZE) % MAXSIZE != Q.rear) {printf("%d ", Q.base[i]);i++;}
}//功能菜单列表
void show_help() {printf("******* 功能菜单列表 *******\n");printf("1----入队------------------\n");printf("2----求循环队列长度----------\n");printf("3----出队------------------\n");printf("4----取队头元素-------------\n");printf("5----清空循环队列-----------\n");printf("6----销毁循环队列-----------\n");printf("7----判断循环队列是否为空-----\n");printf("8----批量插入元素------------\n");printf("9----显示队列元素------------\n");printf("10----退出------------------\n\n");
}int main() {SqQueue sq;//初始化Status rInitStack = InitQueue(sq);if (rInitStack == OK) {printf("循环队列初始化成功!\n");} else {printf("循环队列初始化失败!\n");}while (1) {//功能菜单列表show_help();int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {case 1: {//入队Status EnQueueindex;printf("请输入插入元素(请在英文状态下输入例如:1): \n");scanf("%d", &EnQueueindex);Status rEnQueue = EnQueue(sq, EnQueueindex);if (rEnQueue == OK) {printf("向循环队列入队%d成功!\n", EnQueueindex);} else {printf("向循环队列入队失败!\n");}}break;case 2: {//求循环队列的长度int length = QueueLength(sq);printf("循环队列的长度为:%d。 \n\n", length);}break;case 3: {//出队Status DeQueueindex;Status rDeQueue = DeQueue(sq, DeQueueindex);if (rDeQueue == OK) {printf("向循环队列出队%d成功!\n", DeQueueindex);} else {printf("向循环队列出队失败!\n");}}break;case 4: {//求队头元素Status topData;Status rGetHead = GetHead(sq, topData);if (rGetHead == OK) {printf("向循环队列获取队头元素:%d\n", topData);} else {printf("向循环队列获取队头元素失败!\n");}}break;case 5: { //清空Status rClearStack = ClearQueue(sq);if (rClearStack == OK) {printf("循环队列清空成功!\n");} else {printf("循环队列清空失败!\n");}}break;case 6: {//销毁Status rDestroyStack = DestroyQueue(sq);if (rDestroyStack == OK) {printf("循环队列销毁成功!\n");} else {printf("循环队列销毁失败!\n");}}break;case 7: {///判空Status ClearStatus = QueueEmpty(sq);if (ClearStatus == true) {printf("循环队列为空!\n\n");} else {printf("循环队列不为空!\n\n");}}break;case 8: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);QElemType array[on];for (int i = 1; i <= on; i++) {printf("向循环队列第%d个位置插入元素为:", i);scanf("%d", &array[i]);}for (int i = 1; i <= on; i++) {Status InsertStatus = EnQueue(sq, array[i]);if (InsertStatus == OK) {printf("向循环队列第%d个位置插入元素%d成功!\n", i, array[i]);} else {printf("向循环队列第%d个位置插入元素%d失败!\n", i, array[i]);}}}break;case 9: {//输出链表元素DisplayQueue(sq);printf("\n");}break;case 10: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}return 1;
}

  五、运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/244770.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——1_6 代理(Proxy)

诗有可解不可解&#xff0c;若镜花水月勿泥其迹可也 —— 谢榛 文章目录 定义图纸一个例子&#xff1a;图片搜索器图片加载搜索器直接在Image添加组合他们 各种各样的代理远程代理&#xff1a;镜中月&#xff0c;水中花保护代理&#xff1a;对象也该有隐私引用代理&#xff1a;…

AR 自回归模型

文章目录 总的代码ADF 检验(是否平稳)差分操作拟合AR 模型预测可视化总的代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.ar_model import AutoReg from statsmodels.tsa.stattools import adfuller# 生成一个示例时间序…

【github】使用github action 拉取国外docker镜像

使用github action 拉取国外docker镜像 k8s部署经常用到国外镜像&#xff0c;如果本地无法拉取可以考虑使用github action环境 github action的ci服务器在国外&#xff0c;不受中国防火墙影响github action 自带docker命令运行时直接将你仓库代码拉取下来 步骤 你的国内dock…

仿真机器人-深度学习CV和激光雷达感知(项目2)day03【机器人简介与ROS基础】

文章目录 前言机器人简介机器人应用与前景机器人形态机器人的构成 ROS基础ROS的作用和特点ROS的运行机制ROS常用命令 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容是我为复试准备的第二个项目 &#x1f4ab;欢迎…

手拉手JavaFX UI控件与springboot3+FX桌面开发

目录 javaFx文本 javaFX颜色 字体 Label标签 Button按钮 //按钮单击事件 鼠标、键盘事件 //(鼠标)双击事件 //键盘事件 单选按钮RadioButton 快捷键、键盘事件 CheckBox复选框 ChoiceBox选择框 Text文本 TextField(输入框)、TextArea文本域 //过滤 (传入一个参数&a…

开始学习vue2(Vue方法)

一、过滤器 过滤器&#xff08;Filters&#xff09;是 vue 为开发者提供的功能&#xff0c;常用于文本的格式 化。过滤器可以用在两个地方&#xff1a;插值表达式 和 v-bind 属性绑定。 过滤器应该被添加在 JavaScript 表达式的尾部&#xff0c;由“管道符 ”进行 调用&#…

USB-C接口给显示器带来怎样的变化?

随着科技的不断发展&#xff0c;Type-C接口已经成为现代电子设备中常见的接口标准。它不仅可以提供高速的数据传输&#xff0c;还可以实现快速充电和视频传输等功能。因此&#xff0c;使用Type-C接口的显示器方案也受到了广泛的关注。本文将介绍Type-C接口显示器的优势、应用场…

[MRCTF2020]你传你呢1

尝试了几次&#xff0c;发现是黑名单过滤&#xff0c;只要包含文件后缀有ph就传不了&#xff0c;同时也有类型检测&#xff0c;需要抓包修改content-type 尝试了上传.htaccess&#xff0c;成功了&#xff0c;可以利用这让服务器将jpg文件当作php来解析&#xff0c;详见超详细文…

【K8S 云原生】K8S的图形化工具——Rancher

目录 一、rancher概述 1、rancher概念 2、rancher和K8S的区别&#xff1a; 二、实验 1、安装部署 2、给集群添加监控&#xff1a; 3、创建命名空间&#xff1a; 4、创建deployment&#xff1a; 5、创建service&#xff1a; 6、创建ingress&#xff1a; 7、创建hpa 8…

qt-C++笔记之使用信号和槽实现跨类成员变量同步响应

qt-C笔记之使用信号和槽实现跨类成员变量同步响应 —— 杭州 2024-01-24 code review! 文章目录 qt-C笔记之使用信号和槽实现跨类成员变量同步响应1.运行2.main.cpp3.test.pro4.编译 1.运行 2.main.cpp 代码 #include <QCoreApplication> #include <QObject> #…

leetcode刷题(剑指offer) 105.从前序与中序遍历序列构造二叉树

105.从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,…

Webpack5 基本使用 - 1

Webpack 是什么 webpack 的核心目的是打包&#xff0c;即把源代码一个一个的 js 文件&#xff0c;打包汇总为一个总文件 bundle.js。 基本配置包括mode指定打包模式&#xff0c;entry指定打包入口&#xff0c;output指定打包输出目录。 另外&#xff0c;由于 webpack默认只能打…

kali安装LAMP和DVWA

LANMP简介 LANMP是指一组通常用来搭建动态网站或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大的Web应用程序平台。 L:指Linux&#xff0c;一类Unix计算机操作…

静态web服务器实战

准备html页面&#xff0c;包含两个页面(index.html, index2.html)和一个404(404html)页面&#xff0c;目录示意&#xff1a; 1.返回固定页面 with open("website/index.html","r") as file: import socket# # 返回固定的页面 website/index.html if __na…

静态分析C语言生成函数调用关系的利器——cally和egypt

大纲 准备工作安装graphviz安装cally安装egypt简单分析GCC产生RTL&#xff08;Register transfer language&#xff09;文件callyegypt总结 高级分析callyegypt 总结参考资料 在《静态分析C语言生成函数调用关系的利器——cflow》和《静态分析C语言生成函数调用关系的利器——c…

HarmonyOS鸿蒙学习基础篇 - Text文本组件

该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Text文本组件是可以显示一段文本的组件。该组件从API Version 7开始支持&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 子组件 可…

Flutter 页面嵌入 Android原生 View

前言 文章主要讲解Flutter页面如何使用Android原生View&#xff0c;但用到了Flutter 和 Android原生 相互通信知识&#xff0c;建议先看完这篇讲解通信的文章 Flutter 与 Android原生 相互通信&#xff1a;BasicMessageChannel、MethodChannel、EventChannel-CSDN博客 数据观…

Java面试题50道

文章目录 1.谈谈你对Spring的理解2.Spring的常用注解有哪些3.Spring中的bean线程安全吗4.Spring中的设计模式有哪些5.Spring事务传播行为有几种6.Spring是怎么解决循环依赖的7.SpringBoot自动配置原理8.SpringBoot配置文件类型以及加载顺序9.SpringCloud的常用组件有哪些10.说一…

rabbitmq基础-java-5、Topic交换机

1、简介 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。 只不过Topic类型Exchange可以让队列在绑定BindingKey 的时候使用通配符&#xff01; BindingKey 一般都是有一个或多个单词组成&#xff0c;多个单词之间以.分割&#x…

(SSO单点登录)多个系统之间如何实现账号互通

SSO具有以下优点&#xff1a; 降低访问第三方网站风险&#xff1b;降低用户名和密码的管理成本&#xff1b;提高用户试用满意度&#xff1b;SSO使用标准的身份认证和授权协议&#xff0c;如OAuth、OpenID Connect等&#xff0c;可以保障用户身份的安全性和隐私性。 单点登录最大…